2016-08-10 45 views
3

我是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,那麼它使用哪個實例?它是如何決定使用哪一個的?

+1

我暫時關閉此作爲「[什麼是單態限制嗎?](http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction)」的副本。這個問題解決了如何爲'a'選擇'Num'實例,但我想不解決如何爲'm'選擇'Monad'實例。所以我認爲這不是重複的,值得仔細的回答。 –

+1

其實我問的是如何選擇monad的特定實例作爲通用monad。我猜它使用了列表的'>> =',但我不知道爲什麼。 – Juan

+1

我懷疑它可能是IO-monad。通常ghci會嘗試'打印'REPL結果,但是如果它遇到一個IO動作,它就會執行它,並打印動作返回的結果。像'(Monad m,Num a)=> m a'這樣的類型與'IO a'兼容,也許這就是它用來決定是否執行與打印當前REPL表達式的標準。 – ErikR

回答

7

這遵循GHCi有點像doIO的想法。每當你輸入一個表達式時,它首先試着看結果的類型是否可以被專門化爲IO a的形式。如果可以,它會執行IO操作並僅打印結果。否則它會打印表達式本身的結果。

要強制GHCi轉到您想要的任何特定monad,您可以添加一個類型註釋。請注意0​​如何得到不同的處理(以及與未經任何註釋處理表達式的方式相同)。

ghci> return 10 >>= return :: Maybe Int 
Just 10 
ghci> return 10 >>= return :: [Int] 
[10] 
ghci> return 10 >>= return :: IO Int 
10 

順便說一句,有一個關於選擇何種實例Num一個完全不同的問題,一個具有一切與默認規則和單態的限制。

+0

因此,使用任何使用monad以外的類型類型的模糊表達式應該給我一個錯誤,而不是選擇一個默認的嗎? – Juan

+0

@Juan如果我的理解正確,是的...... – Alec

+0

@Juan,如果我在'ghci'中輸入'return mempty',我得到一個模棱兩可的類型錯誤,所以如果我正確理解你的問題,那麼是的。 – villou24

相關問題