翻转是否会改变函数的参数数据类型

时间:2014-07-18 22:24:18

标签: haskell higher-order-functions

似乎翻转对我的功能做了意想不到的事情

示例1:

let m = flip max
:t max
max :: Ord a => a -> a ->
:t m
m :: () -> () -> ()

示例2:

let f x y = x + y
:t f
f :: Num a => a -> a -> a
let g = flip f
:t g
g :: Integer -> Integer -> Integer

f可以评估浮点数,但g在看到浮点数时会抛出错误。但是当我跑步时

(flip f) 1.5 1.7

评价很好! 这些表达有什么区别?

1 个答案:

答案 0 :(得分:12)

The dreaded monomorphism restriction strikes again!

这是由于单态限制,导致多态函数被限制在GHCi中的单态类型。只需运行:set -XNoMonomorphismRestriction或给m显式类型签名即可解决此问题(提示::set +m在GHCi中启用多行模式。)


请参阅以下问题以获得解释: