えーと、前回チャーチ数を定義してC言語にSKIコンビネータを組み込んでみよう、とか意気込んでいましたが失敗しました
というか、C言語では直接コンビネータ論理を扱うのは無理でした
というのも、コンビネータにはカリー化という概念が必要で、これは何かというと、
int func(int, int)
という函数があったとき、これは
intとintを受け取ってintを返す函数
と読めます。
ここで、func(3)としたときに、これを
あともう1つだけintを受け取ってintを返す函数
と読むことにします(もちろんC言語の構文ではこのようなことはできません)
さらに、func(3,4)としたときに、これを
もう引数は取らずintだけを返す函数(=値)
と読むことにします
つまり、funcは函数ですがfunc(3)も函数であり、func(3,4)にいたっても函数(定数函数)であると見なします
この考え方がカリー化です
コンビネータにはカリー化があるおかげで函数だけでちゃんとしたプログラムが組めるようになるんですが、残念ながらC言語にカリー化を直接構文として導入することは不可能そうなので、上に書いた通りどうやらCでコンビネータをすることは不可能である、と結論づけました。
というわけでLazy Kを直接実装すること以外に、Cでコンビネータをプログラムとして扱うことは出来そうにありませんでした。。。><
CでSKIコンビネータできなかったお話
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
Re: CでSKIコンビネータできなかったお話
みょんさんの日記にいつもコメを書こうとするものの、難しくて脳みそが付いて行かない私です・・。
に・・日本語でおk・・!
関数型言語や論理型言語の類はProlog位しか組んだことが無いですが私には難し過ぎるとです・・。
に・・日本語でおk・・!
関数型言語や論理型言語の類はProlog位しか組んだことが無いですが私には難し過ぎるとです・・。
Re: CでSKIコンビネータできなかったお話
>キューさん
わざわざコメントありがとうございます><
わざわざコメントありがとうございます><
Re: CでSKIコンビネータできなかったお話
C++だと std::bind や boost::bind による引数束縛ができます
最後に編集したユーザー h2so5 on 2012年10月16日(火) 16:36 [ 編集 3 回目 ]
RE: CでSKIコンビネータできなかったお話
>h2so5さん
なるほど、C++だと引数束縛が出来るんですね…(引数が過剰の場合の処理がそれで出来るのかという疑問は残りますが)
というか、C++でやりたくなかったのは、C++にはそのままラムダ式が組み込まれているので、
I = λx.x
K = λxy.x
S = λxyz.(x z)(y z)
をそのまま実装すれば終わってしまうから、あまり練習にはならないなぁと思ったのです
結局C言語では無理だという結論だけ出てしまいましたが…><;
もしも機会があれば、C++でLazy Kの実装なんかも面白そうですね〜☆
なるほど、C++だと引数束縛が出来るんですね…(引数が過剰の場合の処理がそれで出来るのかという疑問は残りますが)
というか、C++でやりたくなかったのは、C++にはそのままラムダ式が組み込まれているので、
I = λx.x
K = λxy.x
S = λxyz.(x z)(y z)
をそのまま実装すれば終わってしまうから、あまり練習にはならないなぁと思ったのです
結局C言語では無理だという結論だけ出てしまいましたが…><;
もしも機会があれば、C++でLazy Kの実装なんかも面白そうですね〜☆