• ベストアンサー

関数型プログラミングを料理の仕方でたとえてください

関数型プログラミングを料理の仕方でたとえてください。 作る料理はなんでも構いません。 料理の一般的なレシピというのは、手続き型プログラミングで たとえることが可能だと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

「手続き型」ではなく、「関数型」ですか、純粋Lispって、昔挫折したので、もう一度理解すべく以下のサイトをざっと読んでみました http://www.ibm.com/developerworks/jp/views/java/libraryview.jsp?sort_by=&show_abstract=true&show_all=&search_flag=&contentarea_by=Java+technology&search_by=%E9%96%A2%E6%95%B0%E5%9E%8B%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%3A&topic_by=-1&industry_by=-1&type_by=%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%A8%AE%E9%A1%9E&ibm-search=%E6%A4%9C%E7%B4%A2 「手続き型」にどっぷりつかってると解りにくいけど、JavaScript の closure関数みたいなのを引数そのものとして扱うので、材料そのものを引数にはしないらしい。 料理における「不変propaty」はなにかっていうと、「調理器具」だろう。 でもって、「関数そのものが引数になる」ということは、「調理行動」とか、「不変propatyとしてもつ器具による調理」が関数であり、引数になったり返値になるわけで、 ゆでる(){propaty:なべ;run(){ゆでる}} 煮付け(){propaty:なべ;run(){調味料を入れて、煮詰める}} ボウル盛り(){propaty:ボウル;盛りつけ(){}} 焼く(){propaty:フライパン;run(){焼く}} 皿盛り(){propaty:皿;盛りつけ(){}} 卵料理(調理法){ 状態チェック:卵 is 生 ? 調理法.run(); switch (){ 状態チェック:卵 is 固ゆで ? return ボウル盛り(); 状態チェック:卵 is 卵焼き ? return 皿盛り(); } } 結果 = 卵料理(ゆでる())  「結果」 には、ボウル盛り() が返ってくる、状態チェックすると固ゆで卵がはいってるとなって 結果 = 卵料理(焼く())  「結果」 には、皿盛り() が返ってきて、状態チェックすると、卵焼きが載っている という具合になるのですかね? かなり、いいかげんな文法で書いてますけど。文法すらもプログラミング対象になりえるらしいので。。。

otaks
質問者

お礼

ありがとうございます。 参照URLの技術文書の存在は知りませんでした。 結構文量もあるのでゆっくり見てみようと思います。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

面白そうな問題なので、頭を捻ってみましたが、ダメでした。 そもそも、料理は食材の状態を変化させるもの、関数型プログラミングで言うところの「副作用」ですから、純粋な関数型プログラミングとは相性がよくないでしょう。 自信はありませんが、あえてやるなら 「ゆで卵」関数 入力: 卵 出力: (入力された)卵 副作用: 卵はゆでられて、固まった状態になる といったところではないでしょうか?

otaks
質問者

お礼

「副作用」。聞いたことがあります。 関数型プログラミングでは副作用をおこしてはならないのですね。 となると入力で卵を入れたら、関数の中で「では、こちらがゆであがった卵です」 と入力した卵とは別の卵が出現してそれが返ってくるのかなと思ったりしました。