2013-07-08 8 views
9

私はhaskellを学習していますが、関数アプリケーション演算子$ curryのやり方は少し混乱しています。

GHCによると$のタイプは

*Main>:t ($) 
($) :: (a->b) -> a -> b 

あるしかし、私は、私はフリップを使用する必要がありますと仮定しますけれども、私は$の署名によると、次のコード

*Main>map ($ 2) [(*2), (+2), (/2)] 
[4.0,4.0,1.0] 

を入力することができます$への最初のパラメータは(a-> b)であるためです。例えば、私は次の

curry_test :: Integer -> String -> String 
curry_test x y = (show x) ++ " " ++ y 
*Main> let x = curry_test "123" 
    Couldn't match expected type `Integer' with actual type `[Char]' 
In the first argument of `curry_test', namely `"123"' 
In the expression: curry_test "123" 
In an equation for `x': x = curry_test "123" 

を行うことはできません。しかし、私は

let x = curry_test 2 
+0

ヒントを行うことができます – DiegoNolan

答えて

11

中置演算子は、特別なルールがありますすることができます。このページを参照してください:基本的にhttp://www.haskell.org/haskellwiki/Section_of_an_infix_operator

$は中置演算子であることから、($ 2)は実際に$の2番目の引数として2を修正し、それはflip ($) 2と同等です。

考え方は、オペレータによる部分的なアプリケーションをより直観的にすることです。たとえば、map (/ 2)がリストにある場合は、リストの各要素を除外記号の左側の「見つからない」場所に置くことができます。 > A - - > A` `(*)::ヌムA => A:あなたはcurry_test機能この方法を使用する場合は

、あなたは

let x = (`curry_test` "123") 
関連する問題