haskell - 为什么 Haskell 让我返回一个空列表,其中列表中的列表是预期的?

标签 haskell typechecking

我真的是 Haskell 的新手,并且一直在经历 99 problems translation.这是我对数字 9 的解决方案:

pack :: (Eq a) => [a] -> [[a]]
pack (xs)
    | null xs = []
    | otherwise = 
        let (matched, unmatched) = span (== head xs) xs
        in [matched] ++ pack unmatched

我不明白我被允许做什么 | null xs = []当类型签名说函数返回 [[]] .我见过针对同一问题的其他解决方案做同样的事情。

我的意思是,我不是在提示,但这是特别允许的吗?有什么需要注意的警告吗?

如果有帮助,我在默认的 Windows 7 Haskell Platform 2013.2.0.0 安装上使用 GHCi。

最佳答案

[]是一个空列表。它有以下类型:

[] :: [b] -- Note: I'm using b instead of a because your function already uses a

b可以是一切。可以选择b这样[b] ~ [[a]] ? (〜是类型的平等)?是的,只需使用 b ~ [a] [] 的类型变为:
[] :: [b] :: [[a]]     -- When b ~ [a]

所以[]也是 [[a]] 类型的值. []是任何类型列表的有效值,无论是 a 列表还是 a 列表列表。

关于haskell - 为什么 Haskell 让我返回一个空列表,其中列表中的列表是预期的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432355/

相关文章:

haskell - (<$>) 如何保留关联性

haskell - Text.PrettyPrint : Starting indentation from left margin

r - R 中检查对象类的首选方法

TypeScript - 检查对象的属性是否是具有给定签名的函数

python - 有没有更好的方法来使用 Python 的 typing 模块为复合类型创建类型别名?

haskell - 为什么Haskell类型系统无法捕获这一点?

haskell - liftM 与原始复制

sql - 通过键列表获取多个持久条目

haskell - 为什么 `fmap` 需要在 `succ` 上调用 `Maybe Integer` ?

python - 我如何强制 PyCharm 对未声明的类型发出警告?