最近とある理由でClojureに触りました。 8年近くCやPythonなどの手続き型言語を使ってきた者にとって,最初は「関数型言語」に戸惑いもありましたが,一方で,Pythonが関数型言語の良い点をたくさん取り入れていることにも気づきました。 そこで,Pythonでどこまで関数型言語ライクなことができるか,Clojureのサンプルを参考ししつつ試していきたいと思います。 今回はayato-pさんが公開されている「Clojure の日本語ガイド」の イディオム集 の内容をPythonで実装してみます。 手元のPythonのバージョンは3.6.1です。 複数のコレクションの要素を index ごとにまとめる
結論を先にまとめると、以下の3つです。 1. グローバル変数の宣言をなるべく減らしたい場合 2. ユーザが引数を与えてカスタマイズ可能な自由度の高い「関数」を生成したい場合 3. 前回、呼び出されて実行されたときの演算結果(値)を内部で保存して、次に呼び出されたときに、前回の結果(値)に対して、さらに同じ処理(演算)を行う関数を生成したい場合 以下、「クロージャ」の定義から、頭の整理まで、分かりやすい参考ウェブサイトへのリンクを張りつつ、見ていきます。 【 定義 】クロージャ takeharuさん Qiita記事(2013/07/22)「JavaScriptでクロージャ入門」 「自分を囲むスコープにある変数を参照できる関数」 Wikipedia 「クロージャ」 引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。関数とそれを評価する環
Libraries for building AI applications, LLM integrations, and autonomous agents. Agent Skills django-ai-plugins - Django backend agent skills for Django, DRF, Celery, and Django-specific code review. sentry-skills - Python-focused engineering skills for code review, debugging, and backend workflows. trailofbits-skills - Python-friendly security skills for auditing, testing, and safer backend devel
多くの関数型プログラミングに関する記事が教えてくれるのは、抽象的な関数型のテクニックです。つまり関数合成やパイプライン、高階関数などです。この記事では違います。ここでは、プログラマが毎日書く、命令型で非関数型のコードの例を示し、それを関数型の形式へ書き換えます。 最初のセクションでは、短いデータ変換のループを取り上げ、map関数やreduce関数に書き換えていきます。2つ目のセクションではより長いループを取り上げ、ユニットに分解し、それぞれのユニットを関数型に書き換えます。3つ目のセクションでは、連続した長いデータ変換のループを関数型のパイプラインに分解します。 ここではPythonでの例を取り扱います。というのも多くのプログラマはPythonを読むのは簡単だと思っているからです。多くの例では、mapやreduce、パイプラインなどの多くの言語に共通する機能を例示するため、Python的な
lambdaを使っててどうも気になるのが、ループ(再帰)するために一時的に関数に名前をつけなければならないところだ。 一時的なローカル変数が簡単に設定できる言語ならともかく、Pythonではそれも結構面倒だ。 ところが、つらつらとネットを探していくと、妙なモノを発見。 『Yコンビネータ(Y combinator)』とか『不動点コンビネータ (fixed point combinator)』あるいは『不動点演算子』とか呼ばれるモノで、コレを使うと、どうやら関数に名前を付けなくとも再帰できるという代物らしい。 喜びいさんで見てみたが……書けはしたものの、理解するのに苦労した。 今回はその解説を、私のようにλ表記になじみの無い人でもわかるように、基本的に一般の関数式とPython式で書いてみることにした。 さらに、同じ式を2回書いて、次にドコにドコを適用させるかを色分けし、その結果も色分けして書
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ''' Implementation of the fixed point combinator Y. ----------------------------------------------- The Y combinator is a higher order function that suffices following relation: Y(F) = F(Y(F)) From the fixed point property we can get an idea on
PythonでCleanやHaskellのリスト相当を準備で、関数プログラミングの準備ができたので、いよいよ関数プログラミングにチャレンジしてみよう。その前に、「関数プログラミングって何がどういいの?」という人は、 なぜ関数プログラミングは重要かを一読しておこう。 まず、Consリストを生成するいくつかの関数を定義しよう。手始めに、指定された値の無限長のConsリストを生成する関数repeat()を作る。 def repeat(v): return Cons.lazyCons(v, lambda: repeat(v)) # 一見再帰呼び出しのようだがそうではない 次に等差数列を生成する関数を定義する。 def seq(start=0, step=1): return Cons.lazyCons(start, lambda: seq(start+step, step)) Pythonのzip
CleanやHaskellといった純粋関数プログラミング言語は生産性が高いとあちこちに書いてあったので、いろいろと勉強しているところだ。 勉強していると、Pythonなどの最近の命令型(imperative)あるいは手続き型(procedural)といわれる言語でもかなり似たような記述ができそうな気がした(さすがにJavaやCとかだと無理そうだが)。そこで、Pythonを使って関数プログラミングの醍醐味をどこまで味わえるかチャレンジしてみることにした。あまり関数プログラミングに馴染みのない人にも理解しやすく説明できるように心がけるつもりだ(というか私もあまり馴染みがない)。 純粋関数プログラミング言語では、遅延評価を行えることが特徴となっている。遅延評価とは、すごく簡単に言ってしまうと、必要になるまで式の評価や文の実行をしないことだ。たとえば、無限に続く数列(数値のリスト)を生成する関数を
Python のデコレータはなかなか面白い機能だと思ったので、試しにカリー化を実装してみました。 @curry def f(x,y,z): ... などと書くと、カリー化されたfが定義されます。まぁ functools.partial があれば全然必要無いシロモノではあるのですが。 複数まとめて関数適用するとき f(x)(y)(z) とか気持ち悪いので、f.apply(x,y,z) みたいに普通っぽく呼び出せるようにもなっています。 可変長引数とは相性悪いです(*付き引数=引数1個ぶんとして扱われます)。 def arity_of(f): return len(f.func_code.co_varnames) class curry: def __init__(self, f, n=None, args=None): self.func = f self.arity = n if n !=
データ構築子はただの関数じゃないのか? Haskell のリストが分からない。遅延評価も分からない。 - IT戦記 http://d.hatena.ne.jp/amachang/20080201/1201881246 いや、関数なのは別に構わないのだけど、リストを返す関数にしてしまってはいけないと思う。それじゃ「(呼ぶ前の)未評価の状態」と「(読んだ後の)リスト全部ができあがっている状態」の2つの状態しか取れない。実際には「頭1個だけ評価済み」「頭2個だけ評価済み」…と無数の状態があるので、これが全部関数に分かれている必要がある。 というわけでまず「評価前の状態(Thunk)」と「評価後の値」を表現するクラスを作ってみた。Thunkのforceを呼ぶと結果がValueになるまで評価を繰り返す。 >>> class Value(object): def __init__(self, valu
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く