【发布时间】:2019-04-03 17:22:36
【问题描述】:
我在使用 Haskell 编写的程序时遇到了一些困难。它背后的想法是递归地在列表列表中找到最短的列表并将其返回。我已经成功地编写了程序,但我似乎无法弄清楚我在其中做错了什么。这些是我尝试编译时遇到的错误:
- 无法将类型“a”与“[[a]]”匹配,“a”是受类型签名约束的刚性类型变量:shortest :: forall a。 [[a]] -> [a] at shortest.hs:1:13。预期类型:[[[a]]],实际类型:[a]
- 在“shortest”的第一个参数中,即“y”。在‘(:)’的第一个参数中,即‘shortest y’。在表达式中:最短 y : [list]
- 相关绑定包括list :: [[a]](绑定在shortest.hs:4:15)、y :: [a](绑定在shortest.hs:4:13)、x :: [a] (在 shortest.hs:4:11 处绑定),shortest :: [[a]] -> [a](在 shortest.hs:2:1 处绑定)。
这是我正在使用的代码:
shortest :: [[a]] -> [a]
shortest [] = []
shortest [y] = y
shortest (x:y:list)
| length x > length y = shortest y:[list]
| otherwise = shortest x:[list]
如果有人能给我任何关于我哪里出错的指示,我将不胜感激!
【问题讨论】:
-
我认为你只需要括号。
shortest (y:[list])和 x 情况相同。:的优先级使它读起来像(shortest y) : [list] -
@jkeuhlen 谢谢!我真的只是发现了自己,看了这么久我没有看到明显的东西!
-
很高兴有帮助。我将其添加为答案,因为这是此类事物而不是 cmets 更永久的地方。
标签: haskell recursion minimum type-mismatch