Haskell Language
関数の構文
サーチ…
警備員
ガードを使用して関数を定義することができます。ガードは、入力に従って動作を分類すると考えることができます。
次の関数定義を実行します。
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