Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么可以';GHCi是否解决[]的类型?_Haskell_Types_Polymorphism_Ghc - Fatal编程技术网

Haskell 为什么可以';GHCi是否解决[]的类型?

Haskell 为什么可以';GHCi是否解决[]的类型?,haskell,types,polymorphism,ghc,Haskell,Types,Polymorphism,Ghc,为什么Haskell不能解析[](列表列表)的类型? 为什么它不是简单的*->*,因为我可以给它一个类似Int的类型,然后得到[[Int]],这是一种*我认为它与Maybe相同,尽管在后一种情况下,原因可能更清楚:“外部”类型构造函数希望传递一种类型*,但是看到类型为*->*(内部的可能是/[])的类型构造函数并抱怨。如果我是正确的,这实际上不是GHCi的:kind功能的问题,而是找到正确的语法来表示更高级类型构造函数的组成 作为一种解决方法,类似于 :kind forall a. [[a]]

为什么Haskell不能解析[](列表列表)的类型?

为什么它不是简单的*->*,因为我可以给它一个类似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不是。