据我所知,->
有*->*->*
种,而((->) 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
,而我的想法是在本机函数类型上实现KClass。
那怎么办呢?
答案 0 :(得分:10)
不幸的是,它无法完成。
人们可能希望“类型级lambdas”(让我们写出它们/\
);那么你就可以写forall a b. /\c. a -> b -> c
来表示这一点。这将是一个非常方便的功能,并且已经对类型系统进行了大量研究,但是您付出的代价是类型推断变得不可判定。所以Haskell委员会决定跳过它。