1

Haskell 级别:新手

目标:找到表示为列表的树的元素的根

输入(树节点)(数组中的位置表示节点号):[0,1,9,4,9,6,6,7,8,9]

调用的函数:getRoot 3

预期产出:9

代码

li = [0,1,9,4,9,6,6,7,8,9]
getRoot::Integer->Integer
getRoot n | li!!n /= n    = getRoot li!!n
getRoot n | otherwise     = li!!n

错误信息

错误文件:.\test2.hs:111 - 应用程序中的类型错误
*** 表情:li!!n
*** 期限:n
*** 类型:整数
*** 不匹配:Int

编译器:WinHugs

尝试了“整数”和“整数”的各种组合来声明函数的类型。似乎数组访问返回一个 Integer 但随后与失败的 Int 进行比较。不知道为什么它不将 Int 转换为 Integers。

或者是其他的东西?

在互联网、教程和 stackoverflow 上搜索。

4

3 回答 3

6

索引函数 的类型(!!)为:

Prelude> :t (!!)
(!!) :: [a] -> Int -> a

索引必须是类型Int

你有一个类型:

getRoot::Integer->Integer

你索引的地方,n,是一个Integer。您必须将其转换为 anInt才能用作索引。

这可以通过两种方式完成:

此外,您应该升级到 GHC 和Haskell 平台,因为 Hugs 是 Haskell 的一个未维护的过时版本。

于 2012-09-26T16:04:39.297 回答
2

(!!)有类型[a] -> Int -> a。如果将类型签名更改为getRootto Int -> Int,代码将编译:

li :: [Int]
li = [0,1,9,4,9,6,6,7,8,9]

getRoot::Int->Int
getRoot n | li!!n /= n    = getRoot (li!!n)
getRoot n | otherwise     = li!!n

测试:

> getRoot 3
9
于 2012-09-26T16:05:48.063 回答
1

(!!) 的类型是

(!!) :: [a] -> Int -> a 

换句话说,它接受的第二个参数应该是一个Int,而不是一个Integer。他们是不同的类型。如果你改变你的类型签名来接受一个Int,这个错误就会消失。

此外,为了使其正常工作,您li必须是Ints 的列表。您可以通过简单地添加类型签名来做到这一点:

li :: [Int]
li = [0,1,9,4,9,6,6,7,8,9]

有了这个,一切都应该很好。祝你好运!

于 2012-09-26T16:09:43.973 回答