我是 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
否则你的
minim
几乎是正确的,除了你定义了 n
两次。关于Haskell : Minimum position,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30119252/