수색…


근위 연대

가드를 사용하여 함수를 정의 할 수 있으며 입력에 따라 동작을 분류 할 수 있습니다.

다음 함수 정의를 가져옵니다.

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 표현식을 사용 let 수행 할 수도 있지만 where 구문 만 사용하면 보호소 가 명명 된 하위 표현식을 참조 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow