use*_*037 5 haskell typechecking
我是Haskell的新手,并且经历了99个问题的翻译.这是我对9号的解决方案:
pack :: (Eq a) => [a] -> [[a]]
pack (xs)
| null xs = []
| otherwise =
let (matched, unmatched) = span (== head xs) xs
in [matched] ++ pack unmatched
Run Code Online (Sandbox Code Playgroud)
| null xs = []当类型签名表示函数返回a时,我不知道如何允许我这样做[[]].我已经看到同样问题的其他解决方案做同样的事情.
我的意思是,我不是在抱怨,但这是特别允许的吗?我有什么需要注意的注意事项吗?
我在默认的Windows 7 Haskell Platform 2013.2.0.0安装上使用GHCi,如果这有帮助的话.
ben*_*ofs 13
[]是一个空列表.它有以下类型:
[] :: [b] -- Note: I'm using b instead of a because your function already uses a
Run Code Online (Sandbox Code Playgroud)
这b可能就是一切.你能选择b这样的[b] ~ [[a]]吗?(〜是类型相等)?是的,只需使用 b ~ [a],[]的类型变为:
[] :: [b] :: [[a]] -- When b ~ [a]
Run Code Online (Sandbox Code Playgroud)
所以[]也是类型的价值[[a]].[]是任何类型的列表的有效值,无论是列表还是列表列表.
[Integer]是指"整数值列表"的类型.可以在这种类型中有一个实际上不包含任何整数的值吗?是的,空列表[]包含零整数.
[[Integer]]是指"整数值列表列表"的类型.这种类型的值是否可以实际包含任何列表?是的,空列表[]包含零列表.
请注意,[]类型与相同类型[[Integer]]完全不同[[]].第一个表示列表的空列表.第二个是非空列表; 它只包含一个元素,它本身就是空列表.包含一个空盒子的盒子与一个根本不含任何盒子的盒子不同!我们当然也[[], [], [], []]可以,外部非空列表包含几个元素,每个元素都是一个空列表.
如果有帮助,可以将类型[[Integer]]视为表示行列表,其中每行都是整数列表.例如,以下内容:
11, 12, 13;
21, 22, 23, 24;
31;
Run Code Online (Sandbox Code Playgroud)
是一种可视化[[Integer]]值的方法[[11, 12, 13], [21, 22, 23, 24], [31]],其中我使用逗号分隔内部列表的元素,并使用分号来终止每一行(也使用换行符使其易于阅读).
在该方案中,[[]]列表由一个空行组成.所以你把它写成一行以分号结尾.虽然[]是没有行可言,甚至没有空的列表.所以你把它写成一个没有分号的空白文件.
如果这有帮助,那么应该很容易看出它如何适用于更抽象的类型[[a]].通常很难,[]有些列表类型(无论括号之间写的是什么类型)总是由元素类型的零组成的列表; 元素类型本身是否是列表(或其他任何"空"概念)并不重要.