我是 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/

10-12 06:43