计算列表中的位置,haskell

时间:2014-07-08 16:15:11

标签: haskell

- 编写一个返回列表位置索引位置的函数

- 列表元素中的给定元素。例如:

- 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

2 个答案:

答案 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)

问题源于您正在比较xelement。在您的类型签名中,您已声明element的类型为[a],而(x:xs)的类型为[a],暗示x的类型为a 1}}。 ==的两个参数必须具有相同的类型。您需要执行[x] == element之类的操作,或者需要更改类型签名,以使elements具有a类型。


除此之外,您的代码非常混乱。从我的描述中可以看出,pos应该具有Eq a => a -> [a] -> [Int]类型,但您提供的定义根本不符合该类型。如果您在开始使用Haskell的语法和类型系统时遇到困难,我建议您查看Learn You a Haskell,它对该语言有一个非常平易近人和初学者友好的介绍。