我只是完全與列表和單子混淆,所以也許我的問題是不正確或非常天真。 我見過的方式做它用mapM_ FUNC here:以新行打印列表元素
mapM_ print [1, 2, 3, 4]
但我不知道它究竟是如何工作的,並想知道我怎麼能在這樣的方式做到這一點:
x <- [1, 2, 3]
print x
,或者,如果我的理解是正確的:
[1, 2, 3] >>= print
我明白[1,2,3]已鍵入[a]
和打印的類型爲Show a => a -> IO()
。我也明白,對於使用monad列表,我們需要在左側輸入List a
,在右側輸入a -> List b
。我對嗎? 你能幫我嗎?
UPD。感謝@MathematicalOrchid解釋mapM_是如何工作的。從我這邊我想解釋一下,真正的問題不是以不同的方式打印任何結果,而是以monad List提供的方式做一些monadic動作(因爲現在我圍繞着OpenGL的東西)。但我明白誤解的根源在於混合單子。
UPD2。感謝大家的答案。我對這個模糊的問題表示歉意。我不知道我需要什麼答案,問題是什麼。這是因爲我不瞭解一些基礎知識。所以現在很難選擇「正確的答案」,因爲每個答案都有我尋找的小小和平。我決定選擇最接近的(儘管現在不是最有用的)我想要的。
'forM_'可能看起來更熟悉一些。它只是顛倒了'mapM_'的參數。嘗試'forM_ [1,2,3] print'。 – jtobin
值得一提的是你正在使用兩個monad:'List'和'IO'。你的'>> ='不起作用的原因是你試圖混合這兩者。 – stusmith
@stusmith:是的,我也只是得到它:) – pkuderov