我是 Haskell 术语的初学者。我必须做一个显示所有最低位置的练习。 例如: [1,2,3,1,1] => 0,3,4 这些是最小位置。 我尝试用两种方法来做到这一点,但这些都不起作用。 请有人帮我设计一个递归版本吗?
第一:
findPos :: [Int]->Int->[Int]
findPos list minimum (list) = [index | (index, e) <- zip [0..] list, e == minimum (list)]
第二:
findPos :: [Int]->Int->[Int]
findPos list (minim el) = [index | (index, e) <- zip [0..] list, e == (minim el)]
minim :: [Int] -> Int
minim x = if (tail(x)==[]) then head(x)
else n
where n = minim (tail(x))
n = if n < head(x) then n
else head(x)
最佳答案
代码的严重问题是函数定义的左侧有一些奇怪的东西。
在第一种情况下,您有:
findPos :: [Int] -> Int-> [Int]
findPos list minimum (list) = …
这是什么意思?从您给 findPos
的签名来看,它需要一个列表和我们正在查找的元素。所以定义必须是:
findPos list m = [index | (index, e) <- zip [0..] list, e == m]
在这种情况下,无需调用右侧的 minim
函数,而是必须在调用 之前调用
向其传递最小元素,如下所示:minim
findPos
findPos' :: [Int] -> [Int]
findPos' list = findPos list (minim list)
或者您可以将定义更改为:
findPos :: [Int] -> [Int]
findPos list = [index | (index, e) <- zip [0..] list, e == minim list]
在这种情况下,您确实在右侧调用了 minim
,但 findPos
的签名变得不同。
现在讨论递归最小函数。您确实应该尽可能多地使用模式匹配:
minim :: [Int] -> Int
minim (x : []) = x
minim (x : xs) = if x < m then x else m
where
m = minim xs
否则,除了定义 n
两次之外,您的 minim
几乎是正确的。
关于 haskell : Minimum position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30119252/