タグ

関連タグで絞り込む (0)

  • 関連タグはありません

タグの絞り込みを解除

curryingとschemeに関するsiroccoのブックマーク (3)

  • カリー化関数 (curried function) について - (new Hatena).blog()

    SML という言語のテキストを読んでいて、これまで自分がカリー化という言葉をよく理解せずに使っていたことに気付きました。 どうやら部分適用の概念と混同していたようです。 一般に、ML や Haskell のような関数型言語においては、カリー化とは n 要素タプルを取る関数 fun f (x,y) = z を、n 引数関数 fun curried_f x y = z に変形することと同義らしいです。(n > 1, z は適当な式とします) ML 等では n 引数を取る関数 fun f x1 x2 ... xn = z (* 1 *) は、実体としては次のように1引数関数が n 個連なったものとして定義されています。 val f = fn x1 => fn x2 => ... fn xn => z (* 2 *) (1 と 2 は同値であり、1 は 2 の構文糖衣に過ぎません) f は、最初の

    カリー化関数 (curried function) について - (new Hatena).blog()
  • ML っぽいカリー化関数を定義するマクロ - (new Hatena).blog()

    ML とか Haskell のコードを読む時に私がどうしても憧れてしまうのが、自動的にカリー化定義される関数です。 Scheme にもカリー化関数を定義する構文自体は存在します (処理系にもよるでしょうが)。 例えば、このようなラムダ式のネストで定義された関数を (define add3 (lambda (a) (lambda (b) (lambda (c) (+ a b c)))))次のようなスタイルで短く書くことができるんです: (define (((add3 a) b) c) (+ a b c))でも全然自動的ではないですし、必ず定義した通りに適用しなければいけません: (((add3 1) 2) 3)2番目と3番目の引数を同時に与える、とかは出来ないわけです。 そこでちょっと知恵をひねりまして、case-lambda を使って、あらゆる関数適用のパターンに応じたラムダ式をあらかじめ

    ML っぽいカリー化関数を定義するマクロ - (new Hatena).blog()
  • Schemeでカリー化

    Haskellの有名な特徴として、関数が勝手にカリー化されるという点があります。 要するにHaskellの関数は常に部分適用可能になっていて、f foo bar bazという関数適用は(((f foo) bar) baz)と解釈されています。これは非常に強力な機能で、汎用的な関数を目的に合わせて簡単に特殊化することができます。 Schemeやその他のLispでは、引数は必ず同時に与えないといけないので、カリー化したものを作ろうとするとクロージャを使って(define f (lambda (x) (lambda (y) (lambda (z) ...))))とでもしなければなりません。しかも呼び出すときには(((f foo) bar) baz)と、1つずつ順番に適用する必要があります。 私が欲しいのは、"(Haskellが透過的にやっているように)与えられた引数を先頭から順に束縛し、足りない

  • 1