haskell : Minimum position

标签 haskell

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

相关文章:

list - 按秒元素对列表列表进行排序

haskell - 为什么这个函数不能进一步减少 eta?

ruby - 映射一系列正分数的排名

haskell - 将 compose 应用于 fmap

regex - 在 Haskell 中将字符串解析为另一种数据类型

haskell - 启用 PolyKinds 时如何为多态函数提供类型签名?

haskell - 为预先存在的类型自动生成 `PersistEntity`

haskell - 如何在haskell中定义一个惰性求和函数?

haskell - 构造函数内部和构造函数外部 forall 量词的区别

haskell - Yesod中的复选框数组