나는 하스켈의 초보자입니다. 그리고 저는 모나드에 대해 배우고 있습니다.모나드 값 컨테이너를 적용하는 함수를 어떻게 올리나요?
data Container a = Container a deriving Show
x = Container 1 :: Container Int
plusOne :: Container Int -> Container Int
plusOne (Container x) = Container (x+1)
Container (IO Int)
에 적용 할 plusOne
을 들어 올릴 수있는 방법이 있습니까?
아니면 같은 새로운 함수를 정의해야합니다
plusOne' :: Container (IO Int) -> Container (IO Int)
plusOne' (Container x) = Container (liftM (+1) x)
덕분에 모든 :-) 그리고 플러스 원을 재정의 피하기 위해 어떤 방법이 있나요?
내가 프로그램을 빌드하기 때문에 처음에는 Monadic이 아닌 컨테이너 (Container Int ..etc와 같은 일반적인 값), 으로 프로그램을 빌드하고 지정된 값 (컨테이너 10 ..)으로 함수를 테스트합니다.
그런 다음이 프로그램을 무작위 또는 생성 된 값에 적용하려고합니다. 이것은 다른 언어 (예 : Lisp, Python ..)로 프로그래밍하는 기본 접근 방식입니다.
그래서이 함수를 모나드 값 컨테이너에 적용하려고 할 때 함수를 재정의하고 싶지는 않습니다.
이 접근법은 하스켈 프로그래밍에서 작동하지 않습니까? 내 마음 모델을 바꿔야합니까? 하스켈에 대한 오해?
instance Functor Container where
fmap f (Container a) = Container (f a)
그런
plusOne = fmap (+1)
및
plusOne' = fmap $ liftM (+1)
그러나, 지금 내가 오해했을 수도 나에게 발생
질문이 편집되었습니다. 여전히 괜찮은가요? 내가 네가 무엇을 묻고 있는지 확신 할 수 없었기 때문에 여기서 물어볼거야. – yatima2975