サーチ…


警備員

ガードを使用して関数を定義することができます。ガードは、入力に従って動作を分類すると考えることができます。

次の関数定義を実行します。

absolute :: Int -> Int  -- definition restricted to Ints for simplicity
absolute n = if (n < 0) then (-n) else n

私たちはガードを使ってそれを並べ替えることができます:

absolute :: Int -> Int
absolute n 
  | n < 0 = -n
  | otherwise = n

この文脈otherwiseは、そうでなければTrue意味のあるエイリアスなので、常に最後のガードでなければなりません。

パターンマッチング

Haskellは、関数定義とcase文の両方でパターンマッチング式をサポートしています。

case文は、Haskellのすべての型をサポートする点を除けば、他の言語のスイッチによく似ています。

簡単に始めましょう:

longName :: String -> String
longName name = case name of
                   "Alex"  -> "Alexander"
                   "Jenny" -> "Jennifer"
                   _       -> "Unknown"  -- the "default" case, if you like

あるいは、 case文を使用せずに、パターンマッチングとなる式のように関数を定義することもできます。

longName "Alex"  = "Alexander"
longName "Jenny" = "Jennifer"
longName _       = "Unknown"

もっと一般的な例は、 Maybe型です:

data Person = Person { name :: String, petName :: (Maybe String) }

hasPet :: Person -> Bool
hasPet (Person _ Nothing) = False
hasPet _ = True  -- Maybe can only take `Just a` or `Nothing`, so this wildcard suffices

リスト上でパターンマッチングを使うこともできます:

isEmptyList :: [a] -> Bool
isEmptyList [] = True
isEmptyList _  = False

addFirstTwoItems :: [Int] -> [Int]
addFirstTwoItems []        = []
addFirstTwoItems (x:[])    = [x]
addFirstTwoItems (x:y:ys)  = (x + y) : ys

実際、パターンマッチングは、任意の型クラスの任意のコンストラクタで使用できます。たとえば、リストのコンストラクタは:です。タプルの,

場所とガードを使用する

この関数を与えると:

annualSalaryCalc :: (RealFloat a) => a -> a -> String
annualSalaryCalc hourlyRate weekHoursOfWork
  | hourlyRate * (weekHoursOfWork * 52) <= 40000  = "Poor child, try to get another job"
  | hourlyRate * (weekHoursOfWork * 52) <= 120000 = "Money, Money, Money!"
  | hourlyRate * (weekHoursOfWork * 52) <= 200000 = "Ri¢hie Ri¢h"
  | otherwise = "Hello Elon Musk!"

繰り返しを避け、コードを読みやすくするためにwhereを使うことができます。使用して、以下の代替機能を参照してくださいwhere

annualSalaryCalc' :: (RealFloat a) => a -> a -> String
annualSalaryCalc' hourlyRate weekHoursOfWork
  | annualSalary <= smallSalary  = "Poor child, try to get another job"
  | annualSalary <= mediumSalary = "Money, Money, Money!"
  | annualSalary <= highSalary   = "Ri¢hie Ri¢h"
  | otherwise = "Hello Elon Musk!"
  where 
      annualSalary = hourlyRate * (weekHoursOfWork * 52)
      (smallSalary, mediumSalary, highSalary)  = (40000, 120000, 200000)

観察されたように、我々は、使用されるwhere計算を繰り返す(排除機能本体の端部にhourlyRate * (weekHoursOfWork * 52)我々はまた、使用されるwhere給与範囲を整理します。

共通の部分式の命名はlet式でも行うことができますが、 where構文だけでガードが名前付き部分式を参照することができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow