首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell糖用于“可应用的”类adts,其中包含函数例如。同构

Haskell糖用于“可应用的”类adts,其中包含函数例如。同构
EN

Stack Overflow用户
提问于 2012-07-06 02:46:18
回答 1查看 101关注 0票数 0

具体地说,受J的共轭算子(g&.f = (f逆)(G)(F))的启发,我需要一种用额外信息扩充函数的方法。最明显的方法是使用ADT。类似于:

代码语言:javascript
复制
data Isomorphism a b = ISO {FW (a -> b) , BW (b -> a)}
(FW f) `isoApp` x = f x
(BW g) `isoApp` x = g x

但是,在大多数情况下,当您只想要前向函数时,对应用程序函数的需求确实会损害代码的可读性。非常有用的是一个类:

代码语言:javascript
复制
class Applyable a b c | a b -> c where
    apply :: a -> b -> c

(我认为b可以与存在量词一起隐含,但我不太确定我不会把签名弄错)

现在,应用将成为隐式的,这样您就可以编写

代码语言:javascript
复制
f x

与任何其他函数一样。例如:

代码语言:javascript
复制
instance Applyable (a -> b) a b where
    apply f x = f x
instance Applyable (Isomorphism a b) a b where
    apply f x = (FW f) x

inverse (Iso f g) = Iso g f

然后,您可以编写类似这样的代码:

代码语言:javascript
复制
conjugate :: (Applyable g b b) => g -> Iso a b -> b -> a
f `conjugate` g = (inverse f) . g . f

理想情况下,可以推断类型签名

然而,这些语义看起来很复杂,因为您还需要修改(.)支持Applyable而不是函数。有没有办法简单地欺骗类型系统,使其将可应用的数据类型视为所有正常用途的函数?有没有根本原因导致这是不可能的/不好的主意?

EN

回答 1

Stack Overflow用户

发布于 2012-07-06 02:59:47

据我所知,函数应用程序可能是整个Haskell语言中唯一不能覆盖的东西。

但是,您可以为此设计某种运算符。诚然,f # x没有f x那么好,但它比f `isoApp` x更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11350608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档