這幾個問題集於一身:類型和做記號
在
do
符號,並每行必須返還相同種類?例如,我可以在單個do
塊中寫入一行,該塊返回一個IO
monad,另一行返回一個整數? (我的理解的基礎上,脫糖與>>
和>>=
如何似乎工作,是,答案是否定的。)如果沒有,那麼編譯器如何確定哪些類型的線必須全部回報?在我見過的所有例子中,作者都認爲我們只是與
IO
monads合作。但你怎麼知道,對於給定的do
塊,每行必須返回什麼?再次假定#1的答案是否定的:如何使用在
do
塊內不返回正確類型的monad的函數?例如,考慮這個的WebSockets代碼:application :: MVar ServerState -> WS.Request -> WS.WebSockets WS.Hybi00() application state rq = do WS.acceptRequest rq msg <- WS.receiveData :: WS.WebSockets WS.Hybi00 Text return()
假設我要打印的
msg
值。我怎樣才能以與do
區塊的類型不衝突的方式去做?
你爲什麼不試試呢?此外,由於符號只是語法糖(正如您所說,它轉化爲「(>> =)」和「(>>)」),因此手頭的機制與任何其他類型的機制完全相同,而不是具體到do-notation和'Monad's。 – chris
對不起,我無意中弄亂了我上次編輯的代碼格式(引入了枚舉)。不幸的是,我的更正將會有太少的字符被允許作爲編輯。你能再補救一下嗎? – chris
是的,我修好了。我看你是如何試圖使用Markdown編號列表的,但它們似乎與代碼塊有衝突。這就是爲什麼我選擇將每個數字放在自己的段落中。 – rlkw1024