Haskell糖用于包含函数ex的“可应用”类adts。同构

时间:2012-07-05 18:46:18

标签: function haskell adt isomorphism

具体来说,受到J的联合运算符的启发(g& .f =(f inverse)(g)(f)) 我需要一种方法来增加功能和附加信息。显而易见的方法是使用ADT。类似的东西:

data Isomorphism a b = ISO {FW (a -> b) , BW (b -> a)}
(FW f) `isoApp` x = f x
(BW g) `isoApp` x = g x

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

class Applyable a b c | a b -> c where
    apply :: a -> b -> c

(我认为b可以隐含于存在量词,但我不够舒服,以确保我不会得到签名错误)

现在申请将被隐含,所以你可以写

f x
像任何其他功能一样

。例如:

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
然后你可以写下这样的东西:

conjugate :: (Applyable g b b) => g -> Iso a b -> b -> a
f `conjugate` g = (inverse f) . g . f

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

但是,这些语义似乎很复杂,因为您还需要修改(。)以支持Applyable而不是函数。有没有办法简单地欺骗类型系统将Applyable数据类型作为函数用于所有正常目的? 这是不可能/坏主意的根本原因吗?

1 个答案:

答案 0 :(得分:2)

据我所知,函数应用程序可能是您无法覆盖的整个Haskell语言中的一件事。

但是,您可以为此设计某种运算符。不可否认f # x不如f x好,但它优于f `isoApp` x

相关问题