【发布时间】:2014-04-08 16:30:42
【问题描述】:
部分应用单个其他函数似乎会改变所涉及的类型。
从比较长度“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的类型和on compare的类型不一样?
【问题讨论】:
标签: haskell