すでに他の人が説明し、何が欲しいのは、基本的にはこれです:
convert f x y = fromIntegral (f (fromIntegral x) (fromIntegral y))
これは非常に簡単です。しかし、もし私がそれをするなら、私はData.Function
からのon
関数を利用するでしょう。Data.Function
は、それを適用する前に2つの引数を取る関数の入力を変換します。だから、あなたの例では、それは次のようになります。
convert f x y = fromIntegral ((f `on` fromIntegral) x y)
私は、個人的には、さらに一歩進み、この関数は、ポイントを無料にするが、on f fromIntegral
2つの引数を期待するので、あなただけの(.)
を使用することはできませんでしょうので、私は通常、このためにオペレータ定義:これは自分で動作しますなぜあなたがしたい場合は、把握することができますが、今、私はこのよう変換を定義することができます
(.:) = (.) . (.)
を:
convert f = fromIntegral .: (f `on` fromIntegral)
これははるかに読みやすいと感じていますが、私は今のようにハスケルをしばらくコーディングしていたので、私は偏っています。あなたはこの変数の推測されたタイプを見れば
また、あなたはそれはあなたが望んでいたものよりもはるかに一般的だと見たい:
convert :: (Integral a, Integral a1, Num b, Num b1) = (b1 -> b1 -> a) -> a1 -> a1 -> b
をとにかく、私は、これはやや便利です願っています。 >のInt - それのうちのどれかがあなたを混乱させる場合は、私に質問してください、私は喜んで答えると思います:)
のInt 'からの変換ように、このポストは、新人としてあなたを威嚇するために、私は本当に意味するものではありません
- > Int'から 'Integer - > Integer - > Integer'は一般に安全ではありません。なぜなら、誰かが' Int'の範囲外の新しい関数に引数を渡すことができるからです。 – Ryan
しかし、私は変換したいだけで、「安全」であることに気にしないと言うことができます。そのような変換のためのメソッドはありますか? – user3595342
'\ fx y - > fromIntegral(fromIntegral x \' f \ 'fromIntegral y)' – user2407038