2014-06-14 29 views
1

我正在學習Haskell,我一直在嘗試部分應用。 我試圖適用於sortBy。我不會拒絕所產生函數的類型。 它應該如何正確完成?部分應用和sortBy

let mf = sortBy compare 
:t mf 
mf :: [()] -> [()] 
+0

的可能重複[什麼是單態的限制?(http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu

回答

8

這是因爲可怕的monomorphism restriction和ghci的違約行爲。這應該解決這個問題:

λ> :set -XNoMonomorphismRestriction 
λ> import Data.List (sortBy) 
λ> let mf = sortBy compare 
λ> :t mf 
mf :: Ord a => [a] -> [a] 

簡短的故事,因爲單態的限制是,編譯器將嘗試在函數定義減少到一個單一的類型(在你的情況[()] -> [()])。但沒有限制,你會得到一個多態類型(Ord a => [a] -> [a])受類型類型限制。

+0

或'讓MF X = sortBy比較x '如果你不想使用'NoMonomorphismRestriction' – user2407038

4

您正在看到一件神器monomorphism restriction

Prelude Data.List> :set -XNoMonomorphismRestriction 
Prelude Data.List> let mf = sortBy compare 
Prelude Data.List> :t mf 
mf :: Ord a => [a] -> [a]