我是Haskell的新手,并且遇到了我无法理解的“无法构造无限类型”错误。
实际上,除此之外,我什至无法找到一个很好的解释该错误的含义,因此,如果您可以超越我的基本问题并解释“无限类型”错误,我将不胜感激。
这是代码:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
这是尝试将其加载到解释器中的错误:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted )
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, modules loaded: none.
谢谢。
-
这是一些经过更正的代码和用于处理Haskell中“无限类型”错误的一般准则:
更正的代码
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
问题是什么:
我的类型签名指出要插入的第二个参数是列表列表。因此,当我对“ s(x:y:xs)”进行模式匹配时,x和y成为列表。但是我将x和y视为元素,而不是列表。
处理“无限类型”错误的准则:
在大多数情况下,遇到此错误时,您已经忘记了要处理的各种变量的类型,并且试图像使用其他变量一样使用变量。仔细查看所有内容是什么类型以及您如何使用它,通常可以发现问题所在。