List 使用';从列表中访问Int/Integer元素时出错';

List 使用';从列表中访问Int/Integer元素时出错';,list,haskell,List,Haskell,哈斯克尔的水平:新手 目标: 查找表示为列表的树元素的根 输入(树节点)(数组中的位置表示节点编号): [0,1,9,4,9,6,6,7,8,9] 调用的函数: 根目录3 预期产出: 九, 代码: 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 ERROR file:.\test2

哈斯克尔的水平:新手

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

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

调用的函数: 根目录3

预期产出: 九,

代码

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
ERROR file:.\test2.hs:111 - Type error in application *** Expression : li !! n *** Term : n *** Type : Integer *** Does not match : Int 错误消息

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
ERROR file:.\test2.hs:111 - Type error in application *** Expression : li !! n *** Term : n *** Type : Integer *** Does not match : Int 错误文件:。\test2.hs:111-应用程序中的类型错误 ***表达方式:李!!N ***术语:n ***类型:整数 ***不匹配:Int 编译器:WinHugs

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

还是其他的东西


在internet、教程和stackoverflow上搜索。

索引函数的类型,
(!!)
,是:

Prelude> :t (!!)
(!!) :: [a] -> Int -> a
索引的类型必须为
Int

您有一个类型:

getRoot::Integer->Integer
索引中,
n
是一个
整数
。必须将其转换为
Int
以用作索引

这可以通过两种方式实现:

  • 使用
    从整数转换
  • 使用

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

索引函数的类型,
(!!)
,是:

Prelude> :t (!!)
(!!) :: [a] -> Int -> a
索引的类型必须为
Int

您有一个类型:

getRoot::Integer->Integer
索引中,
n
是一个
整数
。必须将其转换为
Int
以用作索引

这可以通过两种方式实现:

  • 使用
    从整数转换
  • 使用
另外,您应该升级到GHC,因为Hugs是Haskell的一个未维护的过时版本。

(!!)
的类型为
[a]->Int->a
。如果将
getRoot
的类型签名更改为
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
(!!)
具有类型
[a]->Int->a
。如果将
getRoot
的类型签名更改为
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
(!!)的类型是

换句话说,它接受的第二个参数应该是
Int
,而不是
整数。他们是不同类型的。如果将类型签名改为接受
Int
,则此错误将消失

此外,为了使其工作,您的
li
必须是
Int
s的列表。只需添加一个类型签名即可:

li :: [Int]
li = [0,1,9,4,9,6,6,7,8,9]
有了这些,一切都会好起来的。祝你好运

(!!)的类型是

换句话说,它接受的第二个参数应该是
Int
,而不是
整数。他们是不同类型的。如果将类型签名改为接受
Int
,则此错误将消失

此外,为了使其工作,您的
li
必须是
Int
s的列表。只需添加一个类型签名即可:

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

有了这些,一切都会好起来的。祝你好运

当然,使用
(!!)
的最好方法就是不要使用它。Haskell列表不是数组!谢谢你提供更多的信息。我将升级到GHC.@C.A.McCann而不是数组。不是名单。无论什么根据元素的位置,这是一种更简单、可能更有效的访问元素的方法。当然,使用
(!!)
的最佳方法是不使用它。Haskell列表不是数组!谢谢你提供更多的信息。我将升级到GHC.@C.A.McCann而不是数组。不是名单。无论什么鉴于元素的位置,这是一种更简单且可能有效的访问元素的方法。啊!我不知道列表类型可以这样声明(li:[Int])。这起作用了。谢谢,啊!我不知道列表类型可以这样声明(li:[Int])。这起作用了。谢谢。一点建议:如果你是初学者,在任何情况下都不要使用
(!!)
或任何其他基于列表的索引功能,包括
head
。如果您认为需要使用这些函数,请更改算法或使用不同的数据结构。继续避免使用这些函数,直到你对Haskell有了足够的了解,知道我为什么要给出这个建议。我会记住这一点。将使用递归和“:”、“++”运算符来代替。@JackBrown编写自己的
(!!)
副本,使用该副本并不视为未使用
(!!)
=)一点建议:如果您是初学者,在任何情况下都不要使用
(!!)
或任何其他基于列表的索引功能,包括
head
。如果您认为需要使用这些函数,请更改算法或使用不同的数据结构。继续避免使用这些函数,直到你对Haskell有了足够的了解,知道我为什么要给出这个建议。我会记住这一点。将使用递归和“:”、“++”运算符来代替。@JackBrown编写自己的
(!!)
副本,使用该副本并不视为未使用
(!!)
=)