24

나는ListT 모나드 트랜스포머는 왜 버그가있는 것으로 간주됩니다 - 모나드 법이 깨지십니까?

ListTmonad laws을 만족하지 않는 버그가 모나드 변압기의 전형적인 예라고 언급 보았다.

간단한 예를 통해 설명 할 수 있습니까?

편집 : 내 생각은 ListT []입니다. 조금 잘못되었으므로, documentation은 교환 가능한 내부 모나드가 필요합니다. 그래서,이 요구 사항을 가지고 있다는 의미에서 ListT 버그가 있습니까? 아니면 또 다른 문제가 있습니까? 합니다 (examples at Haskell wiki 모두 ListT IO 사용 IO 분명히 교환 법칙이 성립하지 않습니다.)

답변

19

는 연관성 법률에 실패하는 방법을 보여줍니다 간단한 예 : 어떻게 해결하는

v :: Int -> ListT [] Int 
v 0 = ListT [[0, 1]] 
v 1 = ListT [[0], [1]] 

main = do 
    print $ runListT $ ((v >=> v) >=> v) 0 
    -- = [[0,1,0,0,1],[0,1,1,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1]] 
    print $ runListT $ (v >=> (v >=> v)) 0 
    -- = [[0,1,0,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0,1],[0,1,1,0],[0,1,1,1]] 

더 많은 예제 (대부분 IO 사용) 솔루션을 ListTListT done right에서 찾을 수 있습니다.

+2

설명서에 따르면 변환 된 모나드는 교환 가능해야합니다. 예. 'v n = ListT $ map (read :: String -> Int). 순열. 보여 주다 . (+ n)' – applicative

+1

@ applylicative 좋은 지적, 나는 그것을 놓쳤다. 나는 (->) 모나드로 시도했지만, 지금까지는 반례를 찾을 수 없었다. –

+8

음 ... 그들은 "모나드 변압기"라고 부르며 "교환 가능한 모나드 변압기"는 아닙니다. 몇 개의 특정 모나드에 적용했을 때만 올바르게 작동하는 변압기를 정의했다면 누구나 만족스러운 것으로 간주할까요? –