据我所知,->的类型为*->*->*,而((->) 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/

10-10 06:14