私が関数を持っているとしましょう:
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
ます。
私は今、非常に異なるプロジェクトでこの状況に何度も遭遇しましたが、良い解決策を見つけることができませんでした。