递归Haskell - 最小值函数

Ura*_*rah 2 haskell functional-programming

有没有使用haskell函数的另一种方法来执行此功能

    mymin :: (Ord a) => [a] -> a 
    mymin [] = error "empty list"
    mymin [x] = x  
    mymin (x:xs)   
          | x < mt = x  
          | otherwise = mt  
            where mt = mymin xs
Run Code Online (Sandbox Code Playgroud)

并告诉我什么mymin :: (Ord a) => [a] ->a意思?

And*_*ewC 11

如果您不被允许使用其他功能,那么您的方式很好.

你可以做到

min' [] = error "empty list"
min' (x:xs) = minhelper x xs where
  minhelper m [] = m
  minhelper m (y:ys) | y < m = minhelper y ys
                     | otherwise = minhelper m ys
Run Code Online (Sandbox Code Playgroud)

但我不认为它比你的一般用途更好.它跟踪m递归调用的最小值.

我们可以重写minhelper的第二个案例

  minhelper m (y:ys) = minhelper (if y<m then y else m) ys
Run Code Online (Sandbox Code Playgroud)

利用在Haskell中if-then-else处理表达式而不是指令的事实.


mymin :: Ord a => [a] -> a
Run Code Online (Sandbox Code Playgroud)

Ord a =>表示mymin函数适用于在其上定义a不等式的类型(<=).(它在这里定义.)同样,如果它说Eq a =>这意味着它适用于在它们上定义了a相等的类型(==).

[a] -> a意味着它需要一个as 列表并给你一个a回报.

  • 由于OP似乎是完全新鲜的,所以值得指出的是,这里的`<=`只是一个小于或等于函数,所有类型都是`Ord`必须提供的.它与排版相似的`=>`无关,这是纯粹的语法. (2认同)

dre*_*ash 9

由于AndrewC已经解释了什么mymin :: Ord a => [a] -> a意思.另一个功能可能是:

mymin :: (Ord a) => [a] -> a 
mymin [] = error "empty list"
mymin [x] = x  
mymin (x:y:xs) = if x < y then mymin(x:xs) else mymin(y:xs)
Run Code Online (Sandbox Code Playgroud)

要么

mymin :: (Ord a) => [a] -> a 
mymin [] = error "empty list"
mymin [x] = x  
mymin (x:y:xs) = mymin ((if x < y then x else y):xs)
Run Code Online (Sandbox Code Playgroud)