Haskell 과정에서 Monad 과제를 풀 때 완전히 멈춰 있습니다. 다음에 대해 Monad 관련 함수를 정의하려는 샘플 데이터 유형이 있습니다.
data MyMonad a = MyMonad { func :: String -> a }
instance Functor MyMonad where
fmap f (MyMonad x) = MyMonad (\a -> f (x a))
instance Applicative MyMonad where
pure x = MyMonad (\a -> x)
(MyMonad f) <*> (MyMonad g) = MyMonad (\a -> (f a)(g a))
instance Monad MyMonad where
return x = MyMonad (\a -> x)
MyMonad x >>= f = f (\a -> x a) --my wrong definition
Functor 및 Applicative 인스턴스가 선언되면 Monad에 대해 동일한 작업을 수행하려고하지만 ... func
해당 f
함수에 레코드 구문을 맞추는 방법을 이해하기에는 조금 더 가까워지지 않습니다 . 지금까지 볼 bind
수행하는 기능으로 x
의를 MyMonad
을 통해 매핑하기 전에 f
. 그것은 모나드의 중요한 기능 일뿐입니다. 내가 아는 한 한 데이터 유형 컨텍스트의 일부 값을 다른 컨텍스트에 넣을 수 있습니다. 솔직히 말해서 저는 bind
Monad 인스턴스 [a], Maybe
와 다른 여러 유형에 대한 정의를 알고 있습니다. 예, Monad 클래스가 제공하는 공통 목적이 무엇인지 분명히 알 수 있습니다. 그러나 나는 기록과 같은 것을 다루는 방법에 대한 이해를 높이기 위해이 특정한 경우에 어떤 제안을 받아야합니다.
x
에서이 MyMonad x
형식으로 보유하고 String -> a
있는 반면, f
타입으로 가지고 a -> MyMonad b
, 우리는 따라서 리턴한다 MyMonad b
(즉, 랩하는 기능 String -> b)
.
따라서 우리는 a s :: String
를 b
. 우리는 첫 번째 통과하여 해당 작업을 수행 할 수 있습니다 s
받는 x
기능, 유형의 값을 검색합니다 a
. 우리가 호출 할 수 있습니다 옆 f
에 a
그 매개 변수로, ands의은을 검색 MyMonad g
. 그런 다음이 s
를 g
.
따라서 Monad
인스턴스를 다음과 같이 구현할 수 있습니다 .
instance Monad MyMonad where
return x = MyMonad (\a -> x)
MyMonad x >>= f = MyMonad (\s -> let MyMonad g = f (x s) in g s)
"getter"를 정의 func :: MyMonad a -> a -> String
했으므로 데이터 생성자 let … in …
에서 값을 "언 래핑" 하는 표현식을 사용하는 대신 해당 getter를 사용할 수 있습니다 MyMonad
.
instance Monad MyMonad where
return x = MyMonad (\a -> x)
MyMonad x >>= f = MyMonad (\s -> func (f (x s)) s)
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения