Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 哈斯凯尔糖;“可应用”;包含同构函数的类ADT_Function_Haskell_Adt_Isomorphism - Fatal编程技术网

Function 哈斯凯尔糖;“可应用”;包含同构函数的类ADT

Function 哈斯凯尔糖;“可应用”;包含同构函数的类ADT,function,haskell,adt,isomorphism,Function,Haskell,Adt,Isomorphism,具体来说,受J的共轭算子(g&f=(f逆)(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 conjugate :: (Applyable g b b) => g -> Iso a b -> b -> a f `

具体来说,受J的共轭算子(g&f=(f逆)(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
conjugate :: (Applyable g b b) => g -> Iso a b -> b -> a
f `conjugate` g = (inverse f) . g . f
但是,当大多数情况下您只需要forward函数时,对应用程序函数的需要确实会损害代码的可读性。 非常有用的是一个类:

class Applyable a b c | a b -> c where
    apply :: a -> b -> c
(我认为b可以用存在量词隐式表示,但我不能确信我不会把签名弄错)

现在,apply将被隐式设置,这样您就可以编写

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
然后你可以写一些类似的东西:

data Isomorphism a b = ISO {FW (a -> b) , BW (b -> a)}
(FW f) `isoApp` x = f x
(BW g) `isoApp` x = g x
conjugate :: (Applyable g b b) => g -> Iso a b -> b -> a
f `conjugate` g = (inverse f) . g . f
理想情况下,可以推断类型签名

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

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


但是,您可以为此设计某种运算符。诚然,
f#x
不如
fx
好,但它比
f`isoApp`x

好,如果你想要的只是合成,正如这个问题所示,这个类已经存在,而且在Hackage中有几个同构实例,例如in.这是一个有趣的想法(其他人也有过)。您是否已经尝试过,以确保其向后兼容?