당신은이 두 isomorphisms로 다시 독자들에게 기능을 변환 할 수 있습니다
reader :: (r -> a) -> Reader r a
runReader :: Reader r a -> r -> a
일예
addStuff :: Reader Int Int
addStuff = do
a <- reader (*2)
b <- reader (+10)
return (a+b)
다음 코드를 runReader addStuff 5
으로 테스트 할 수 있습니다.
이것은 학습 목적으로 좋습니다. 더 심각한 코드의 경우에는 동형을 많이 사용하지 말고 대신 ask
또는 asks
에 의존해야합니다. 예 :
addStuff :: Reader Int Int
addStuff = (+) <$> asks (*2) <*> asks (+10)
독자 추상화의 요점은 기본 기능에 대해 생각되지 않습니다 : 실용적 스타일을 사용하여 더 나은
addStuff :: Reader Int Int
addStuff = do
x <- ask -- fetch the implicit Int value
let a = (*2) x
b = (+10) x
return (a+b)
또는 더 나은
addStuff :: Reader Int Int
addStuff = do
a <- asks (*2) -- fetch the implicit Int value, and apply the function
b <- asks (+10)
return (a+b)
또는,. ask
프리미티브를 통해 액세스 할 수있는 읽기 전용 변수에 대한 액세스 권한을 가질 수 있습니다.
보통 마지막 단계에서 runReader
을 사용하여 실제로 모나 딕 리더 작업을 사용합니다.
출처
2017-05-23 18:56:25
chi
'ask'를 통해 함수를 매핑해야합니다 :'a <- (*2) <$> ask' – Lazersmoke
고맙습니다,하지만 환경과 함께'addStuff'를 어떻게 호출 할 수 있습니까? 이 코드를 사용하면 오류가 발생합니다 :'addStuff 10' –
그것은 당신의 라이브러리에 달려 있습니다. 'Reader a b -> a -> b'와 isomorphic 한 함수가 필요합니다. 일반적으로'runReader'라고 불립니다. – Lazersmoke