据我所知,->
的类型为*->*->*
,而((->) r)
的类型为*->*
。
假设有一个(a->b->c)
类型,有没有一种方法可以表示(a->b->)
?
我尝试了((->) a ((->) b))
,但这是错误的。
我试过了:
type Kab a b c = (a -> b -> c) -- it is ok
但是在实例声明中使用
Kab
失败:instance KClass (Kab a b) where -- error
我发现可行的唯一方法是声明一个
data
:data Kab a b c = Kab (a -> b -> c)
instance KClass (Kab a b) where ..
但是,如果使用数据,则必须解包
Kab
,而我的想法是在 native 函数类型上实现KClass。那么该怎么做呢?
最佳答案
不幸的是,这无法完成。
可能有人希望使用“类型级lambda”(让我们将它们写为/\
);那么您就可以编写forall a b. /\c. a -> b -> c
来表示这一点。这将是一个非常方便的功能,并且对允许使用此功能的类型系统进行了大量研究,但是您要付出的代价是类型推断变得不确定。因此,Haskell委员会决定跳过它。
关于haskell - Haskell中的善意文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30271553/