Haskell-在列表中查找最小的元素



我有一个函数,它获取一个列表,并且必须返回其中最小的元素。

不幸的是,我一直遇到这个问题:

模式中的解析错误:最小

我可能做错了什么?

minim :: [Int] -> Int
minim []       = 0
minim [x]      = x
minim x:xs     = min x (minim xs)
min :: Int -> Int -> Int
min a b
| a > b  = b
| a < b  = a

如果你想用最Haskell的方式解决它。我会这样解决它:

-- Does not work for empty lists (so maybe needs to be wrapped in some logic)
foldr1 min [-3,1,2,3]
-- Works for empty but needs a "default value" (in this case 0)
foldr min 0 [-3,1,2,3]

如果您想通过自己实现来学习,那么这对我有用

minim :: [Int] -> Int
minim []       = 0
minim [x]      = x
minim (x:xs)   = min x (minim xs)
min :: Int -> Int -> Int
min a b
| a > b  = b
| a < b  = a
| a == b = a

但是,我会让它更安全一些,因为如果 0 为空,它真的是列表中最小的 int 吗?我认为您应该使用Nothing作为结果。

import Data.Maybe
import Prelude hiding (min)
main = print $  minim [1,3,4, 6,6,-9]
minim :: [Int] -> Maybe Int
minim []       = Nothing
minim [x]      = Just x
minim (x:xs)   = min x <$> minim xs
min :: Int -> Int -> Int
min a b
| a > b  = b
| a < b  = a
| a == b = a

使用最小值。

> minimum [2, 1, 3]
> 1

您有一个要匹配的参数(Ints 的列表)。 在你想要匹配该列表的各个部分的地方,你需要把它们放在括号里,以向编译器显示你正在匹配一件事。 因此,最后一个模式应该是(x:xs)

这是实现您要求但不必使用辅助函数(如 min)的另一种实现方法。

minElem::[Int]->Int
minElem [] = 0
minElem [x] = x
minElem (x:y:xs) 
|x > y = minElem (y:xs)
|x < y = minElem (x:xs)
|x == y = minElem (x:xs)

这个函数不应该接受列表,因为当元素类型甚至可能允许负值时,为空列表变出最小值(例如 0)是没有意义的。为了具有完全的安全性和通用性,我们可以使用最小类型。首先,让我们做一个示例输入值:

exampleList = 1 :| [2, 3, 4]

:|是非空列表的构造函数,它们更适合。

要找到最小值,我们可以使用sconcat,它使用 Semigroup 操作组合非空列表的所有元素,在这种情况下,这将类似于其他答案中显示的两个元素的min函数。

> sconcat $ fmap Min exampleList
Min {getMin = 1}

要从Min中提取数字,可以使用getMin

相关内容

  • 没有找到相关文章

最新更新