- 编写一个返回列表位置索引位置的函数
- 列表元素中的给定元素。例如:
- I:职位4 [1,4,3,7,4,2]
- O:[2,5]
pos element list = func element list 0
func :: [a] -> [a] -> [Int] -> [a]
func _ [_] _ = []
func element (x:xs) cont | x==element = cont:func element xs cont+1
| otherwise = func element xs cont+1
抛出此错误:
- Type error in application
*** Expression : x == element
*** Term : x
*** Type : a
*** Does not match : [a]
*** Because : unification would give infinite type
答案 0 :(得分:4)
好好想想你在这里需要什么。
正如@bheklilr所说你的类型错了。 根据您的样本:
positions 4 [1,4,3,7,4,2]
>> [2,5]
我也猜想你需要这样的东西:
positions :: Eq a => a -> [a] -> [Int]
此处a
是您的元素类型,并且您要检查是否相等,它必须是Eq
类的实例。
接下来你显然希望元素与之比较(当然有类型a
),然后你给出一个a
的列表,该函数应该打印出第一个给定值可以的indizes在列表中找到(indizes从1开始明显)。
我们的想法是首先zip
使用[1..]
添加您的元素列表,这样您就可以获得您的意见,然后使用列表在imepra 递归算法中执行常用的 didive。
positions :: Eq a => a -> [a] -> [Int]
positions a xs = indexed a (zip xs [1..])
where indexed _ [] = []
indexed a ((x,i):xs)
| x == a = i:indexed a xs
| otherwise = indexed a xs
这使用内部函数indexed
来处理索引列表(在您的示例中为[(1,1),(4,2),(3,3),(7,4),(4,5),(2,6)]
- 第二个是索引(请参阅zip))
从简单的情况开始:一个空的元素列表 - 你显然根本找不到你的元素(无论是什么元素)所以返回空列表。
如果列表不为空,则模式匹配第一个元素 - 连同它的索引(x,i)
以及索引 -list xs
的其余部分。
无论如何,您需要xs
的结果,所以通过递归调用indexed
来获取结果。
如果x
等于您要查找的元素a
,则将索引i
添加到递归计算结果中,如果不只是返回它。
完成!
以下是您的示例:
*Main> positions 4 [1,4,3,7,4,2]
[2,5]
如果你没有看到zip
的诀窍(这个经常在Haskell中使用,但你必须先看到它),试着想出另一个内部函数(提示:也许你可以将索引作为参数传递出去... ...我认为这可能是一个很好的练习,因为我给了你一个解决方案。
我希望这有帮助 - 有趣。
答案 1 :(得分:3)
问题源于您正在比较x
和element
。在您的类型签名中,您已声明element
的类型为[a]
,而(x:xs)
的类型为[a]
,暗示x
的类型为a
1}}。 ==
的两个参数必须具有相同的类型。您需要执行[x] == element
之类的操作,或者需要更改类型签名,以使elements
具有a
类型。
除此之外,您的代码非常混乱。从我的描述中可以看出,pos
应该具有Eq a => a -> [a] -> [Int]
类型,但您提供的定义根本不符合该类型。如果您在开始使用Haskell的语法和类型系统时遇到困难,我建议您查看Learn You a Haskell,它对该语言有一个非常平易近人和初学者友好的介绍。