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
등, 당신은 사용하여 함께 계산을 체인 수 있습니다 <*>
. 어떤 의미에서 응용 펑 터는 함수와 유사하다고 생각할 수 있습니다. 순수한 기능 f
은 f <$> 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
출력 True
만 y
출력 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.
'IT Share you' 카테고리의 다른 글
svn : 로컬 커밋 (0) | 2020.12.04 |
---|---|
WPF에서 컨트롤이 사용자에게 표시되는지 여부를 어떻게 확인할 수 있습니까? (0) | 2020.12.04 |
.svn / text-base / file.svn-base를 열 수 없습니까? (0) | 2020.12.04 |
jslint 오류 '루프 내에서 함수를 만들지 마십시오'를 수정하는 방법? (0) | 2020.12.04 |
Excel에서 특정 워크 시트를 활성화하는 방법은 무엇입니까? (0) | 2020.12.04 |