这个问题不是主观的。参考书中使用了一个非常具体的动词,我想了解该措词的含义,因为恐怕我误会了某些东西。
从“ 了解您的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)一词。