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 の 2 番目のケースを次のように書き直すことができます。

  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] -> aas のリストを取り、あなたに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 に答える