2012-01-24 12 views
6

(\(a, b) -> a < b)を関数式で表現する方が良いでしょうか?私は何かを見逃していると感じてcurryと一緒に実験すると、もっと混乱してしまいます。タプルと関数の合成

答えて

12

curryここで使用するのは間違っています。タプル上で動作する関数をカルト関数に変換します。それはuncurry (<)だ、この場合

uncurry :: (a -> b -> c) -> (a, b) -> c 

:あなたはuncurryで反対のことを、したいです。

(タプルへの書き込み機能で便利なコンビネータのための別の有用なソースはControl.Arrowである;。(->)Arrowのインスタンスであることから、あなたはb -> cとしてa b cを読むことができる)タイプを見ると

1

はにHaskellの中の最良の方法です任意の関数が何をするのか、最初のアイデアを得る:

curry :: ((a, b) -> c) -> a -> b -> c 
uncurry :: (a -> b -> c) -> (a, b) -> c 

curry:ペア→カレー関数の機能(それcurries機能)。

uncurry:カリング関数→ペアの機能。

Haskell Wiki page on curryingがページの端にある小さな演習を持っています

  • 簡素化curry id
  • 簡素化uncurry const
  • エクスプレスsndcurryまたはuncurryおよびその他の基本的なプレリュード機能を使用し、ラムダ
  • なしラムダとwiなしで関数\(x,y) -> (y,x)を書く唯一のプレリュード関数

これらの練習問題を解決しようとすると、彼らはあなたにハスケル型システムと関数のアプリケーションへの大規模な洞察力を与えるでしょう。

uncurryのいくつかの興味深い用途がありますが、以下の機能に異なる引数を渡すと、彼らが何をするか見てみ:

uncurry (.) :: (b -> c, a -> b) -> a -> c 
uncurry (flip .) :: (b -> a -> b1 -> c, b) -> b1 -> a -> c 
uncurry (flip (.)) :: (a -> b, b -> c) -> a -> c 
uncurry ($) :: (b -> c, b) -> c 
uncurry (flip ($)) :: (a, a -> c) -> c 

-- uncurry (,) is an identity function for pairs 
uncurry (,) :: (a, b) -> (a, b) 
uncurry (,) (1,2) -- returns (1,2) 
uncurry uncurry :: (a -> b -> c, (a, b)) -> c 
uncurry uncurry ((+), (2, 3)) -- returns 5 

-- curry . uncurry and uncurry . curry are identity functions 
curry . uncurry :: (a -> b -> c) -> (a -> b -> c) 
(curry . uncurry) (+) 2 3 -- returns 5 
uncurry . curry :: ((a, b) -> c) -> ((a, b) -> c) 
(uncurry . curry) fst (2,3) -- returns 2 

-- pair -> triple 
uncurry (,,) :: (a, b) -> c -> (a, b, c) 
uncurry (,,) (1,2) 3 -- returns (1,2,3) 
関連する問題