Haskell 为什么可以';GHCi是否解决[]的类型?
为什么Haskell不能解析[](列表列表)的类型?Haskell 为什么可以';GHCi是否解决[]的类型?,haskell,types,polymorphism,ghc,Haskell,Types,Polymorphism,Ghc,为什么Haskell不能解析[](列表列表)的类型? 为什么它不是简单的*->*,因为我可以给它一个类似Int的类型,然后得到[[Int]],这是一种*我认为它与Maybe相同,尽管在后一种情况下,原因可能更清楚:“外部”类型构造函数希望传递一种类型*,但是看到类型为*->*(内部的可能是/[])的类型构造函数并抱怨。如果我是正确的,这实际上不是GHCi的:kind功能的问题,而是找到正确的语法来表示更高级类型构造函数的组成 作为一种解决方法,类似于 :kind forall a. [[a]]
为什么它不是简单的*->*,因为我可以给它一个类似Int的类型,然后得到[[Int]],这是一种*我认为它与
Maybe
相同,尽管在后一种情况下,原因可能更清楚:“外部”类型构造函数希望传递一种类型*
,但是看到类型为*->*
(内部的可能是/[]
)的类型构造函数并抱怨。如果我是正确的,这实际上不是GHCi的:kind
功能的问题,而是找到正确的语法来表示更高级类型构造函数的组成
作为一种解决方法,类似于
:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
可以使用(在适当的语言扩展打开的情况下--存在量化
,我认为--启用所有
语法的。如果我们将[[]]]
定义为[[]]]
,那么很明显,它的类型很差,因为[]]:*->*
如果你真的想要一个“列表列表”,你需要组成两个类型的构造函数*->*
。如果没有一个小样板,你就无法做到这一点,因为Haskell没有类型级别的lambda。但您可以这样做:
newtype Comp f g a = Comp { unComp :: f (g a) }
现在你可以写:
type ListList = Comp [] []
并使用它编写函数:
f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp
像这样的函子组合在多个领域都有应用,特别是Swierstra的来自Haskell Café的这个线程可能是相关的:--类型构造函数的组合。我不认为存在类型是有意的(即*
)。一种简单的方法,但在GHCi之外,是类型a=[[a]]
(即*->*
)。@sdcvvc是一种普遍量化的多态类型(不是存在型)@sdcvvc:forall
行的意思是当有合理的猜测时,确保手头的类型构造函数是什么类型的一种方法——如果有人怀疑Foo
和Bar
都是*->*
,检查的类型是否适用于all a。Foo(条形图a)
是*
是确认这一点的一种方式。我想我还没说清楚。这是我在GHCi里面能想到的最好的。。。在常规源文件中,可以编写type Foo a=[[a]]
,以便在GHCi中键入:k Foo
,从前面取回缺少的*->
,是的。这有点像是问为什么GHC不能找出值的类型,即使sqrt
本身是Double->Double
:虽然sqrt
是多态的,但它在GHCI中工作得很好。一个更好的比喻是:t不是。