说我有一个功能:
f :: Int -> (Rational, Integer)
f b = ((toRational b)+1,(toInteger b)+1)
我想像这样抽象掉(+1):
f :: Int -> (Rational, Integer)
f b = (h (toRational b)
,h (toInteger b))
where h = (+1)
这显然不会起作用,但如果我指定类型签名它将起作用:
f :: Int -> (Rational, Integer)
f b = (h (toRational b)
,h (toInteger b))
where h :: Num a => a -> a
h = (+1)
假设我现在想通过将 h 作为参数传递来进一步抽象函数:
f :: Num a => Int -> (a -> a) -> (Rational, Integer)
f b g = (h (toRational b)
,h (toInteger b))
where h :: Num a => a -> a
h = g
我收到一个错误,即内部 a 与外部 a 不同。
有谁知道如何正确编写这个函数?我想将多态函数传递g
给f
并以多态方式使用它。
我现在在非常不同的项目中多次遇到这种情况,我找不到一个好的解决方案。