2

나는 f 서명과 f' 서명을 가진 f'을 가지고 있습니다. f' :: a -> StateT Int Reader b [c]f' :: a -> StateT Int Reader b [c] 모나드 트랜스 포머 및 다중 모나드 쌓기

f (매우 단순화 된) 계산은 다음과 같습니다 :

f [] = return [] 
f (s:st) = f' s >>= \x -> 
      f st >>= \y -> 
      return $ ... 

그리고 대신 ... 나는 돌아오고 싶습니다. x[c] 부분 ++ 모나드를 감싸는 y[c] 부분.
수동으로 xy를 풀지 ​​않고 수동으로 결과를 다시 입력하지 않고도이 작업을 수행 할 수 있습니까? 간단한 코드를 얻으려면 모나드 스택 맨 아래에 List 모나드가 필요합니까? Reader Monad는 분명히 MonadPlus 클래스의 인스턴스가 아닙니다.

답변

3

xy의 래핑을 의미하지 않습니다.

나는

return (x ++ y) 

난 당신이 원하는 것을 오해하는 것처럼 마지막 줄 것이다?

+0

오, 그래, 당신 're right-thx :) 근원적 인 모나드의 타입과 계산의 결과 타입을 섞었다. – haselhorstk

1

f' sf st은 하나의 모나드에있는 값, 즉 StateT Int Reader b입니다. 그래서 당신은 이미 x :: [c]y :: [c]을 가지고 있고 Dave Hinton이 말한 것처럼 return (x ++ y)으로 작성하면됩니다.

2

또한 단순히

f = fmap concat . mapM f' 

(mapM f' xsxs :: [a]m = StateT Int (Reader b), 그리고 다음 fmap concat는 "모나드 내부"목록을 연결 유형 m [[c]]의 값을 생성합니다.) 정의 할 수 있습니다

관련 문제