具体地说,受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但是,在大多数情况下,当您只想要前向函数时,对应用程序函数的需求确实会损害代码的可读性。非常有用的是一个类:
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而不是函数。有没有办法简单地欺骗类型系统,使其将可应用的数据类型视为所有正常用途的函数?有没有根本原因导致这是不可能的/不好的主意?
发布于 2012-07-06 02:59:47
据我所知,函数应用程序可能是整个Haskell语言中唯一不能覆盖的东西。
但是,您可以为此设计某种运算符。诚然,f # x没有f x那么好,但它比f `isoApp` x更好。
https://stackoverflow.com/questions/11350608
复制相似问题