我是Haskell的新手,所以這可能是一個菜鳥問題。GHCi如何選擇一個Monad類型的實例用於多態操作?
當我做return 10 >>= return
GHCi顯示10
。當我檢查return 10
的類型與:t
它只是說return 10 :: (Monad m, Num a) => m a
,而我的typeOf return 10
我得到一個錯誤。
但據我所知,Haskell必須使用>>=
的特定實例來評估return 10 >>= return
,那麼它使用哪個實例?它是如何決定使用哪一個的?
我暫時關閉此作爲「[什麼是單態限制嗎?](http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction)」的副本。這個問題解決了如何爲'a'選擇'Num'實例,但我想不解決如何爲'm'選擇'Monad'實例。所以我認爲這不是重複的,值得仔細的回答。 –
其實我問的是如何選擇monad的特定實例作爲通用monad。我猜它使用了列表的'>> =',但我不知道爲什麼。 – Juan
我懷疑它可能是IO-monad。通常ghci會嘗試'打印'REPL結果,但是如果它遇到一個IO動作,它就會執行它,並打印動作返回的結果。像'(Monad m,Num a)=> m a'這樣的類型與'IO a'兼容,也許這就是它用來決定是否執行與打印當前REPL表達式的標準。 – ErikR