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

jub*_*kon 0 recursion haskell functional-programming pattern-matching parse-error

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

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

解析模式错误:最小

我做错了什么?

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
Run Code Online (Sandbox Code Playgroud)

Vik*_*ren 5

如果您想以最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]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但是,我会使其更安全些,因为如果它为空,则列表中最小的int真的为0吗?我认为您应该使用它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
Run Code Online (Sandbox Code Playgroud)