我想了解Haskell的單子,所以我讀https://wiki.haskell.org/All_About_Monads向左展開粘結劑在Haskell
讓我們考慮了一段代碼從上面的網站:
maternalGrandfather :: Sheep -> Maybe Sheep
maternalGrandfather s = (return s) >>= mother >>= father
fathersMaternalGrandmother :: Sheep -> Maybe Sheep
fathersMaternalGrandmother s = (return s) >>= father >>= mother >>= mother
而且一切都清楚了。但我想知道如何做一個很長的(也許是無限的)序列。我的意思是比如:
expand :: Int -> Sheep -> MaybeSheep
和例如擴大expand 10 s
使得(return s) >>= father >>= father >>= father >>= father >>= father .. (10 times)
如何實現它。也許使用遞歸來擴展,但我無法想象停止時可以返回什麼。
一個*無限序列的monadic動作將永遠不會返回。 '(>> =)'運算符對此太嚴格了。 – MathematicalOrchid
@MathematicalOrchid這通常不是真的,'>> ='的操作語義完全取決於函數是如何爲任何特定的monad定義的。例如'fix(\ x - > x:[[1]] >> = scanl(+)1)'是完全明確的。 – user2407038