2
部分應用其他功能似乎會改變所涉及的類型。Haskell部分應用程序似乎不適用於。爲什麼?
上比較長「AAA」,「BB開始」,並從右側脫落的物品,事情開始預見:
Prelude Data.Function> :t on compare length "aaa" "bb"
on compare length "aaa" "bb" :: Ordering
Prelude Data.Function> on compare length "aaa" "bb"
GT
Prelude Data.Function> :t on compare length "aaa"
on compare length "aaa" :: [Char] -> Ordering
Prelude Data.Function> let ocla = on compare length "aaa"
Prelude Data.Function> :t ocla
ocla :: [Char] -> Ordering
Prelude Data.Function> ocla "aa"
GT
Prelude Data.Function> :t on compare length
on compare length :: [a] -> [a] -> Ordering
Prelude Data.Function> let ocl = on compare length
Prelude Data.Function> :t ocl
ocl :: [a] -> [a] -> Ordering
Prelude Data.Function> ocl "aaa" "aa"
GT
但與比較我得到了一個驚喜:
Prelude Data.Function> :t on compare
on compare :: Ord b => (a -> b) -> a -> a -> Ordering
Prelude Data.Function> let oc = on compare
Prelude Data.Function> :t oc
oc :: (a ->()) -> a -> a -> Ordering
Prelude Data.Function> oc length "aaa" "aa"
<interactive>:27:4:
Couldn't match type `Int' with `()'
Expected type: [Char] ->()
Actual type: [Char] -> Int
In the first argument of `oc', namely `length'
In the expression: oc length "aaa" "aa"
In an equation for `it': it = oc length "aaa" "aa"
爲什麼oc的類型與比較的類型不一樣?
或者用GHCI中的':set -XNoMonomorphismRestriction'去。 – Xeo
準確地說,它是與「ExtendedDefaultRules」組合的單態限制。前者強制單形類型。後者導致GHCi選擇'()'而不是報告錯誤。 – kosmikus
@kosmikus TIL。我一定會提到下次這個問題會彈出。 – bheklilr