2016-04-04 15 views
1

私はかなり新しいhaskellですが、私は関数を型変換してこの問題にぶつかります。その関数型以外の関数について何も知らないとしましょう。関数の型を変換して新しい関数として入れることは可能ですか? たとえば関数型をhaskellに変換する方法はありますか?

myfunc:: (Int -> Int -> Int) -> (Integer -> Integer -> Integer) 
myfunc inputfunc = (function with type (Integer -> Integer -> Integer)) 

このようなことはありますか?

+1

のInt 'からの変換ように、このポストは、新人としてあなたを威嚇するために、私は本当に意味するものではありません

- > Int'から 'Integer - > Integer - > Integer'は一般に安全ではありません。なぜなら、誰かが' Int'の範囲外の新しい関数に引数を渡すことができるからです。 – Ryan

+1

しかし、私は変換したいだけで、「安全」であることに気にしないと言うことができます。そのような変換のためのメソッドはありますか? – user3595342

+3

'\ fx y - > fromIntegral(fromIntegral x \' f \ 'fromIntegral y)' – user2407038

答えて

2

すでに他の人が説明し、何が欲しいのは、基本的にはこれです:

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 - それのうちのどれかがあなたを混乱させる場合は、私に質問してください、私は喜んで答えると思います:)

2

ヒント:

  • (Int -> Int -> Int) -> (Integer -> Integer -> Integer)(Int -> Int -> Int) -> Integer -> Integer -> Integerを書き込むことができます。これは3つの引数の関数です。

  • Converting Numbers

+0

私はリンクを見て、変換は基本的に私たちに手前の関数を知っている必要があります。 inputfuncがわからないブラックボックス関数である場合、そのような関数をまだ変換できますか? – user3595342

+1

@ user3595342 3つの引数の関数として 'myfunc'を書き換えます。 inputfuncを指定する引数を作成し、出力を処理します。 – PyRulez

関連する問題