递归Haskell - 最小值函数

时间:2012-12-09 22:23:06

标签: 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

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

2 个答案:

答案 0 :(得分: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

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

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

  minhelper m (y:ys) = minhelper (if y<m then y else m) ys

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


mymin :: Ord a => [a] -> a

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

[a] -> a表示需要a个列表,并为您提供a

答案 1 :(得分: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)

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)