Haskell - 查找列表中的最小元素
Haskell - finding smallest Element in list
我有一个获取列表的函数,并且必须 return 它的最小元素。
不幸的是,我一直遇到这个问题:
Parse error in pattern: minim
我哪里做错了?
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
您有一个参数要匹配(Int
的列表)。在你想要匹配该列表的部分的地方,你需要将它们放在括号中以向编译器显示你正在匹配一件事。因此最后一个模式应该是 (x:xs)
.
如果你想解决它最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 真的是列表中最小的整数吗?我认为您应该使用 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
这是实现您所要求的另一种方法,但无需使用辅助函数,例如 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 表示空列表,当元素类型甚至可能允许负值时。为了完全安全和通用,我们可以使用 Min type。首先,让我们做一个示例输入值:
exampleList = 1 :| [2, 3, 4]
:|
是非空列表的构造函数,更适合。
要找到最小值,我们可以使用 sconcat
,它使用 Semigroup 运算组合非空列表的所有元素,在这种情况下类似于 min
函数其他答案中显示的两个元素。
> sconcat $ fmap Min exampleList
Min {getMin = 1}
要从 Min
中提取数字,您可以使用 getMin
。
使用minimum.
> minimum [2, 1, 3]
> 1
我有一个获取列表的函数,并且必须 return 它的最小元素。
不幸的是,我一直遇到这个问题:
Parse error in pattern: minim
我哪里做错了?
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
您有一个参数要匹配(Int
的列表)。在你想要匹配该列表的部分的地方,你需要将它们放在括号中以向编译器显示你正在匹配一件事。因此最后一个模式应该是 (x:xs)
.
如果你想解决它最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 真的是列表中最小的整数吗?我认为您应该使用 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
这是实现您所要求的另一种方法,但无需使用辅助函数,例如 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 表示空列表,当元素类型甚至可能允许负值时。为了完全安全和通用,我们可以使用 Min type。首先,让我们做一个示例输入值:
exampleList = 1 :| [2, 3, 4]
:|
是非空列表的构造函数,更适合。
要找到最小值,我们可以使用 sconcat
,它使用 Semigroup 运算组合非空列表的所有元素,在这种情况下类似于 min
函数其他答案中显示的两个元素。
> sconcat $ fmap Min exampleList
Min {getMin = 1}
要从 Min
中提取数字,您可以使用 getMin
。
使用minimum.
> minimum [2, 1, 3]
> 1