IT Share you

Control.Applicative를 사용하여 더 깨끗한 Haskell을 작성하는 방법은 무엇입니까?

shareyou 2020. 12. 4. 21:25
반응형

Control.Applicative를 사용하여 더 깨끗한 Haskell을 작성하는 방법은 무엇입니까?


최근 스타일 질문에 대한 답변 에서

main = untilM (isCorrect 42) (read `liftM` getLine)

isCorrect num guess =
  case compare num guess of
    EQ -> putStrLn "You Win!" >> return True
    ...

Martijn은 유용한 대안을 제안했습니다.

main = untilM (isCorrect 42) (read <$> getLine)

EQ -> True <$ putStrLn "You Win!"

Control.Applicative의 추상화를 사용하여 Haskell 코드의 어떤 공통 패턴을 더 명확하게 만들 수 있습니까? Control.Applicative를 효과적으로 사용하기 위해 기억해야 할 유용한 경험 규칙은 무엇입니까?


귀하의 질문에 대한 답변으로 할 말이 많지만, 귀하가 질문 했으므로이 "경험의 법칙"을 제시하겠습니다.

do-notation 을 사용 하고 생성 된 값 [1]이 시퀀싱하는 표현식 [2]에서 사용되지 않는 경우 해당 코드는 Applicative 스타일로 변환 될 수 있습니다. 당신은 순서가있다 표현식에서 생성 된 값 중 하나 이상을 사용하는 경우 마찬가지로, 당신은 사용해야 Monad하고 Applicative동일한 코드를 달성하기 위해 충분히 강한 아니다.

예를 들어 다음 코드를 살펴 보겠습니다.

do a <- e1
   b <- e2
   c <- e3
   return (f a b c)

우리의 오른쪽에있는 표현의 없음에 볼 <-생성 된 값 중 하나를 수행합니다 ( a, b, c)가 나타납니다. 따라서 응용 코드를 사용하여 변환 할 수 있습니다. 가능한 변환은 다음과 같습니다.

f <$> e1 <*> e2 <*> e3

그리고 또 다른:

liftA3 f e1 e2 e3

반면에 다음 코드를 예로 들어 보겠습니다.

do a <- e1
   b <- e2 a
   c <- e3
   return (f b c)

Applicative생성 된 값 a이 이해의 표현식에서 나중에 사용 되기 때문에이 코드는 [3]을 사용할 수 없습니다 . Monad결과를 얻기 위해 사용해야 합니다 Applicative. 이유를 파악 하기 위해 고려해보십시오.

이 주제에 대해 더 흥미롭고 유용한 세부 사항이 있지만, 이해를 훑어보고 스타일 코드에 do포함될 수 있는지 매우 빠르게 결정할 수있는이 경험 법칙을 제공하고자 Applicative합니다.

[1] 왼쪽에 표시되는 항목 <-.

[2] 오른쪽에 나타나는 표현식 <-.

[3] 엄밀히 말해서, 그것의 일부는 e2 a.


기본적으로 모나드는 응용 펑터이기도합니다 [1]. 그래서, 당신이 사용하는 자신을 발견 할 때마다 liftM, liftM2등, 당신은 사용하여 함께 계산을 체인 수 있습니다 <*>. 어떤 의미에서 응용 펑 터는 함수와 유사하다고 생각할 수 있습니다. 순수한 기능 ff <$> x <*> y <*> z.

모나드와 비교하여 응용 펑 터는 인수를 선택적으로 실행할 수 없습니다. 모든 논쟁의 부작용이 발생할 것입니다.

import Control.Applicative

ifte condition trueClause falseClause = do
  c <- condition
  if c then trueClause else falseClause

x = ifte (return True) (putStrLn "True") (putStrLn "False")

ifte' condition trueClause falseClause = 
  if condition then trueClause else falseClause

y = ifte' <$> (pure True) <*> (putStrLn "True") <*> (putStrLn "False")

x출력 Truey출력 True하고 False순차적으로 출력 합니다.

[1] Typeclassopedia . 추천.

[2] http://www.soi.city.ac.uk/~ross/papers/Applicative.html . 이것은 학술 논문이지만 따르기가 어렵지 않습니다.

[3] http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors. Explains the deal very well.

[4] http://book.realworldhaskell.org/read/using-parsec.html#id652399. Shows how the monadic Parsec library can also be used in an applicative way.


See The basics of applicative functors, put to practical work by Bryan O'Sullivan.

참고URL : https://stackoverflow.com/questions/2104446/how-do-you-use-control-applicative-to-write-cleaner-haskell

반응형