这个问题不是主观的。参考书中使用了一个非常具体的动词,我想了解该措词的含义,因为恐怕我误会了某些东西。
从“ 了解您的Haskell”中,以下段落是包含“我们假设*” 的第三段也是最后一段。
data Barry t k p = Barry { yabba :: p, dabba :: t k }现在我们要使其成为的实例
Functor。Functor想要那种类型,* -> *但Barry看起来不像那种类型。是什么样的Barry?好吧,我们看到它需要三个类型参数,因此它将是something -> something -> something -> *。可以肯定地说这p是一种具体类型,因此具有一种*。因为k,我们假设*等等,t因此具有一种* -> *。现在,让something我们用用作占位符的替换这些类型,我们看到它有一种(* -> *) -> * -> * -> *。
我们为什么要承担一切呢?读完“我们假设X(即我们假设X为真)”后,我自然认为我们也应该考虑X为假的情况。在这个例子中的具体情况,不能t是那种(* -> *) -> *和k那种(* -> *)?如果是这样,无论是什么t,k实际上是什么,t k仍将是一个具体类型,不是吗?
我看到整个推理过程随后都针对编译器进行了检查,但我认为编译器不假定。如果可以,我想知道,如果不知道,恐怕会丢失该段的含义。
k :: L为任何类型的L,只要t :: L -> *。但是L,这里的编译器必须选择一些特定的,或者诉诸于多种类。多种是最通用的选择,但是GHC在这里选择L = *(基本的Haskell没有多种,必须将它们作为扩展打开)。由于LYAH选择的是相当随意的东西,因此LYAH使用“假定”(AFAICT)一词。