2

是否有另一种方法可以在不使用 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意思?

4

2 回答 2

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不等式的类型(<=)。(它在这里定义。)同样,如果它说Eq a =>这意味着它适用于在它们上定义了a相等性的类型。(==)

[a] -> a意味着它需要一个as 列表并给你一个a支持。

于 2012-12-09T22:30:16.997 回答
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)
于 2012-12-09T22:38:14.850 回答