似乎翻转对我的功能做了意想不到的事情
示例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
评价很好! 这些表达有什么区别?
答案 0 :(得分:12)
The dreaded monomorphism restriction strikes again!
这是由于单态限制,导致多态函数被限制在GHCi中的单态类型。只需运行:set -XNoMonomorphismRestriction
或给m
显式类型签名即可解决此问题(提示::set +m
在GHCi中启用多行模式。)
请参阅以下问题以获得解释: