軸受カリー化は、問題(私は説明するためのHaskellを使用)の2つのセットに分割することができるコードを有しています。 構文、実装。
構文問題1:
カリー化は、特定の場合においてより大きなコード明瞭さを可能にします。 明快さは何を意味しますか?この機能を読み取ることで、その機能性が明確に示されます。例: マップ関数。このように
map : (a -> b) -> ([a] -> [b])
読むには、我々は、マップが[b]
に[a]
を変換関数にbs
からas
を変換する機能を持ち上げる高階関数であることがわかります。
このような直感は、そのような式を理解するときに特に便利です。
map (map (+1))
内側マップのタイプは、[a] -> [b]
です。 外部地図の種類を理解するために、我々は上から直観を再帰的に適用する。外側の地図は[a] -> [b]
を[[a]] -> [[b]]
に持ち上げます。
この直感はあなたに多くを転送します。 map
をfmap
、map
に任意のコンテナで一般化すれば、本当に簡単に式を読むことができます(この例では、fmap
の型を別の型に単調変更しています)。
showInt : Int -> String
(fmap . fmap . fmap) showInt : Tree (Set [Int]) -> Tree (Set [String])
は、うまくいけば、上記fmap
がある任意の容器上関数にバニラ機能を持ち上げるこの一般概念を提供することを示します。
構文の問題2:
カリー化もポイントのない形で機能を表現することを可能にします。
nthSmallest : Int -> [Int] -> Maybe Int
nthSmallest n = safeHead . drop n . sort
safeHead (x:_) = Just x
safeHead _ = Nothing
上記は通常、データの明示的な操作ではなく機能のパイプラインという考え方を示すため、良いスタイルと考えられています。
実装:Haskellで
、(カリー化を介して)ポイント自由なスタイルは、私たちは機能を最適化することができます。ポイントフリーの形式で関数を書くことで、私たちはそれをメモすることができます。メモ化バージョンのようカリー関数として書く
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
not_memoized_fib :: Int -> Integer
not_memoized_fib x = map fib [0 ..] !! x
where fib 0 = 0
fib 1 = 1
fib n = not_memoized_fib (n-2) + not_memoized_fib (n-1)
エンティティとしてカリー機能を扱い、したがって、それをmemoizes。
これらの用語の他の用途は「間違っている」と思いますか? – dfeuer