2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

関数型言語一般

1 :デフォルトの名無しさん:2017/04/01(土) 08:12:00.61 ID:Ylmlk/tQ.net
関数型言語について。
言語同士の比較、おすすめ、不満点など。

2 :デフォルトの名無しさん:2017/04/01(土) 08:15:11.18 ID:Ylmlk/tQ.net
■Haskell
https://www.haskell.org/

■clojure
https://clojure.org/

■F#
http://fsharp.org/

■OCaml
http://www.ocaml.org/

■Elixir
http://elixir-lang.org/

■Scala
https://www.scala-lang.org/

3 :デフォルトの名無しさん:2017/04/01(土) 13:38:03.21 ID:PxbGeRPT.net
●関数型言語スレ
関数型言語
http://pc.2ch.net/test/read.cgi/tech/987954395/
関数型言語Part2
http://pc3.2ch.net/test/read.cgi/tech/1007387924/
関数型言語Part3
http://pc5.2ch.net/test/read.cgi/tech/1037527388/
関数型言語Part4
http://pc5.2ch.net/test/read.cgi/tech/1083624060/
関数型言語Part IV
http://pc12.2ch.net/test/read.cgi/tech/1083649982/
関数型言語Part5
http://toro.2ch.net/test/read.cgi/tech/1252470706/
関数型言語は何故普及しないのかを考える
http://hibari.2ch.net/test/read.cgi/tech/1277215506/
関数型言語は何故普及しないのかを考える
http://hibari.2ch.net/test/read.cgi/tech/1286791669/
【アンチ】関数型言語は使えない【玩具】
http://toro.2ch.net/test/read.cgi/tech/1320743217/
【アンチ】関数型言語は使えない【玩具】 2
http://echo.2ch.net/test/read.cgi/tech/1330429547/

●関連スレ
関数型と手続き型
http://hibari.2ch.net/test/read.cgi/tech/1145115971/
【激突】関数型言語 VS オブジェクト指向言語
http://toro.2ch.net/test/read.cgi/tech/1331328955/
【激突】関数型言語 VS オブジェクト指向言語2
http://toro.2ch.net/test/read.cgi/tech/1333801607/
LLにおける関数型プログラミング
http://echo.2ch.net/test/read.cgi/tech/1345123070/

4 :デフォルトの名無しさん:2017/08/15(火) 12:20:02.34 ID:ILMibSrs.net
謎の関数型言語。存在意義すら分らない。

5 :デフォルトの名無しさん:2017/08/28(月) 00:19:18.72 ID:sXxziykI.net
>>2
関数型言語の元祖のLispがない!

https://common-lisp.net/

6 :デフォルトの名無しさん:2017/08/28(月) 18:50:41.80 ID:E9te9/2P.net
>>5
当初のLispはともかく、現在のLisp、ことにCommon Lispで書かれてるのなんて関数型の香りが皆無な
手続き的なスタイルのプログラムなのでは。
まだしもSchemeならば関数型っぽいコードを書いている比率は高いでしょうが。

7 :デフォルトの名無しさん:2017/08/28(月) 20:22:00.16 ID:sXxziykI.net
>>6
>>2はまあ最近の
流行言語だけ並べたんだろうけど

ClojureはLispのJVM方言で
Lisp知らなくていきなり
読み書きできないと思うよ

あとScalaもオブジェクト指向寄りだし
Lispがマルチパラダイムなのは問題ない

8 :デフォルトの名無しさん:2017/08/28(月) 21:56:05.68 ID:d332SnKK.net
F#は関数型風なだけでは

9 :デフォルトの名無しさん:2017/08/28(月) 22:10:46.59 ID:jyyFGMG6.net
F# は、MSお得意の取り敢えず流行に乗る戦法でしょ。 関数型とはいいつつも、.NETとの相性を重視しすぎてるから。

10 :デフォルトの名無しさん:2017/08/29(火) 01:01:48.01 ID:Y/wjG5sQ.net
F#もScalaもOCamlの
マルチパラダイム路線

純粋関数型だとユーザ減るのがまずあるだろうし
あと.NETやJavaのライブラリがOOだから
関数型で一貫させるのが難しい

11 :デフォルトの名無しさん:2017/08/29(火) 07:12:25.41 ID:w4q0vtYo.net
>>8
F#が関数型風でしかない理由は?

12 :デフォルトの名無しさん:2017/08/29(火) 19:50:04.09 ID:YYB0POw9.net
>>8
> F#は関数型風なだけでは

確かにF#には破壊的な代入(普通の手続き型言語での代入文や代入演算と同等な操作で状態やメモリの概念が前提)はあるから
厳密な意味では関数型ではないが、それを言い出すとOCamlなどのML系の言語は全て関数型風なだけになってしまう
F#はMicrosoft版MLというのが私の見方です

もちろんsetq(Schemeはset!)のあるLisp系の全ての言語も関数型でなく関数型風なだけになるし
その基準だと純粋に関数型と言えるのはHaskellや昔のMiranda, Goferなどlazyな言語のいくつかだけになるだろう

lazy evaluationは破壊的代入や例外処理とは相性が悪い…すっきりとして一貫性のある意味論を構築するのが困難なので
否応なく純粋な関数型にならざるを得ない

13 :デフォルトの名無しさん:2017/08/29(火) 20:28:35.62 ID:Y/wjG5sQ.net
ScalaだってValとVarがあるから
F#だけ仲間はずれにする意味が分からん

14 :デフォルトの名無しさん:2017/08/29(火) 20:30:51.81 ID:Y/wjG5sQ.net
つーか非純粋の方が普及して
メジャーなんだから仕様がない

15 :デフォルトの名無しさん:2017/08/29(火) 22:27:18.69 ID:6jCp/lLP.net
無職板では関数型言語を推奨しております


プログラミングしようぜ
http://medaka.2ch.net/test/read.cgi/dame/1439747269/1

16 :デフォルトの名無しさん:2017/08/29(火) 22:50:10.12 ID:Y/wjG5sQ.net
わざわざ趣味プログラミングに
関数型言語使わなくてもいいだろ

17 :デフォルトの名無しさん:2017/08/29(火) 22:57:14.84 ID:meRDrQIM.net
存在意義すら分らないので、

話題も特にない。

18 :デフォルトの名無しさん:2017/08/30(水) 01:42:34.77 ID:f+agdgD5.net
>>16
関数型プログラミング言語の利用シーンにはどんなものがあるの?

19 :デフォルトの名無しさん:2017/08/30(水) 05:38:40.83 ID:p2CL0unP.net
>>18
1. 参照透過でバグを減らしたいとき
2. 並列計算をしたいとき
3. 複雑な処理をしたいとき

20 :デフォルトの名無しさん:2017/08/30(水) 07:16:45.84 ID:5Xr5KcHr.net
むしろ関数型言語が向かない場面とかムッサゴリゴリ最適化したい場面ぐらいしか無いと思うんだが

21 :デフォルトの名無しさん:2017/08/30(水) 16:17:32.10 ID:p2CL0unP.net
ゲームみたいに複雑な状態遷移は
オブジェクト指向の方が組みやすい

22 :デフォルトの名無しさん:2017/08/30(水) 17:00:09.35 ID:J9KH8yJx.net
FRPでおけー

23 :デフォルトの名無しさん:2017/10/01(日) 12:07:51.52 ID:gmDeRBlV.net
>>21
8x8マスに白か黒か何もないかしかないだろ。

24 :デフォルトの名無しさん:2017/10/08(日) 22:55:26.60 ID:sIfqyVAH.net
これだけ人気ないのにC++、Java、C#にムラダ式なんて追加すんなよ。迷惑極まりない。

25 :デフォルトの名無しさん:2017/10/08(日) 23:30:11.76 ID:X3i4AnjM.net
ムラダ式?

26 :デフォルトの名無しさん:2017/10/09(月) 00:11:49.71 ID:c41RoAYB.net
新種かな

27 :デフォルトの名無しさん:2017/10/09(月) 09:44:48.41 ID:QGFdPsAO.net
ムラダ製作所

28 :デフォルトの名無しさん:2017/10/09(月) 17:18:51.89 ID:bLguG3ky.net
ムナゲ式

29 :デフォルトの名無しさん:2017/10/14(土) 02:18:51.03 ID:F+wwiVHB.net
存在意義のない関数型言語。

30 :デフォルトの名無しさん:2017/10/14(土) 10:22:30.75 ID:xOkDS1UJ.net
>>24
数学人気あるとは思わないけどすごい重要だろ?
まあバカは数学使わなくても生きていけてるみたいだからそういう世界で生きてればいいと思うよ

31 :デフォルトの名無しさん:2017/10/14(土) 13:57:42.76 ID:F+wwiVHB.net
こういう馬鹿のせいで人工衛星が制御不能になって落ちるんだよ。

32 :デフォルトの名無しさん:2018/05/23(水) 21:33:08.31 ID:Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

UBD4D

33 :デフォルトの名無しさん:2018/07/05(木) 00:25:45.57 ID:RfoszcD2.net
CB6

34 :デフォルトの名無しさん:2018/07/08(日) 10:06:50.55 ID:teDyKOrA.net
Scheme 始めたんだけど、本やサイト見ると最初のほうに「末尾再帰」が出て来る。
これって、関数型プログラミングの本質じゃないよね?ただの最適化技法だよね。

35 :デフォルトの名無しさん:2018/07/08(日) 14:30:26.24 ID:0enAxBm5.net
ただの最適化技法ではあるけど、関数型を徹底するとループカウンタを書き換えられないので
ループは再帰でやるしかないから末尾呼び出しの最適化が無いとすぐスタックオーバーフローして死ぬ

36 :デフォルトの名無しさん:2018/07/08(日) 16:41:28.02 ID:TI2hdDFV.net
なるほど。
でも、最適化はコンパイラの仕事だしなぁ。
何の説明もなく「末尾再帰」「末尾最適化」が出てくるのはどうなのよ?

階乗は、(1 2 3 ...) ってリスト作って乗算オペレータに渡せばいいと思う。
(* 1 2 3 4 5 6 7 8 9 10)

37 :デフォルトの名無しさん:2018/07/08(日) 23:44:41.43 ID:l291c8sA.net
>>36
Schemeでは末尾再帰形をスタックを消費しないループ同様の実行をするというのが言語仕様において規定されている
だから末尾再帰のプログラムをスタックを消費する普通の再帰の実行方式で実装する処理系はSchemeの言語仕様を満たしていない不完全な処理系ということになる

38 :デフォルトの名無しさん:2018/07/20(金) 08:54:02.56 ID:gRfJSMM7.net
そうなんですね。

39 :デフォルトの名無しさん:2018/10/17(水) 18:29:33.99 ID:UzTddT20.net
関数型言語を学びたいけどぜんぜんわからん
何となくやりたいことはわかるけど、それとコードがリンクしない
プログとか読んでも頭いたくなるだけだし
頭好い人にはいいのかもだけど、俺みたいなお馬鹿プログラマにはかける気がしない

40 :デフォルトの名無しさん:2018/10/17(水) 19:50:25.40 ID:px5dKxjh.net
ちな関数型のどの辺?FreeMonadとかやらんでいいぞ

41 :デフォルトの名無しさん:2018/10/17(水) 21:54:15.03 ID:UzTddT20.net
どの辺と聞かれると困るんだけど
モナドの考え方とか
値は変えちゃいかんとか
変数はラベル的にとらえるとか
副作用がどうとか

とにかく今までの考え方を壊して、見方を変えねばならんのかなと思った

42 :デフォルトの名無しさん:2018/10/18(木) 18:29:53.10 ID:AYRrw0PU.net
へんなブログ二本も読んで始める前から嫌いになったわ
おとなしくc#でラムダでも書いてるわ

43 :デフォルトの名無しさん:2018/10/18(木) 20:51:56.44 ID:Jw/UF2kZ.net
>>41
自分はF#とかなのでなるべくイミュータブルに書くけどミュータブル使うとこは使うよって感じですね全部イミュータブルでもシステム書けると思うけどミュータブルで書いた方が手っ取り早いところも多々ありそう

44 :デフォルトの名無しさん:2019/04/16(火) 14:20:52.12 ID:LcPraQem.net
関数型言語の実際の開発効率に関する研究はあるの?

45 :デフォルトの名無しさん:2019/04/16(火) 14:57:30.52 ID:TqTLtNty.net
同じような内容のものをC#からF#に作り直してコード1/5、バグ激減、むしろ速くなったところも多々など言ってる記事あったな

46 :デフォルトの名無しさん:2019/04/16(火) 18:01:18.81 ID:LcPraQem.net
同じものを作り直したからじゃないの?
2つのチームに全く同じものを初めて開発させてどうなるか、みたいな実験が行われないと分からんな

JavaとかVBは検索すると生産効率の調査が行われてるんだけど

47 :デフォルトの名無しさん:2019/04/16(火) 18:52:36.95 ID:TqTLtNty.net
>>46
まあ自分で書いてみりゃC#に比べて明らかにコード短くなるしバグも少ないのは実感できるかと

48 :デフォルトの名無しさん:2019/04/16(火) 19:58:48.26 ID:IYSOO+Im.net
学習コストは高いけど魅力的
大学の授業でこそやってほしい
関数型の授業受けてみたいよなあ...

49 :デフォルトの名無しさん:2019/04/16(火) 22:05:49.14 ID:LcPraQem.net
関数型はデバッグが難しいみたいな話聞くんだけどどうなの?

50 :デフォルトの名無しさん:2019/04/16(火) 22:08:18.21 ID:LcPraQem.net
https://gist.github.com/Gab-km/2419511
>JavaとScalaの開発を比較した最近の実験に基づいた Pankratius,
SchmidtおよびGarretonらによる研究 は、
そんな大勝利を明らかにはしなかった。
確かに、恩恵(関数型のコードが想定よりいいパフォーマンスを出し、
よりコンパクトになった)はあったものの、生産性の結果は、せいぜい、
まちまちだった。Scalaプログラムは目的を成し遂げるために同じか、
それより多くのプログラミングの努力を要し、
またデバッグがより難しくなった。

51 :デフォルトの名無しさん:2019/04/17(水) 00:52:46.71 ID:QXKQsrQs.net
関数型は標準関数や備え付けのメソッドが増えれば増えるほど簡単になりそう
もちろん非純粋関数じゃだめだけど

52 :デフォルトの名無しさん:2019/04/17(水) 01:00:00.53 ID:8ss+sM3t.net
>>49
自分はF#で純粋関数型ではないけれどミューテートする場所が限られるしデバッグむしろしやすいと思うがな
何をもって難しいと言ってるのだろう

53 :デフォルトの名無しさん:2019/04/17(水) 06:21:12.65 ID:uenBKkUK.net
Haskellはデフォルト遅延評価なので慣れていてもその部分のデバッグが難しいという話をする人は居る
Clojureはやはりデフォルトで遅延シーケンスが多く、JavaとClojureのエラーがズラッと並んで慣れていてもデバッグがしんどいという話をする人がいる

後者のエラーメッセージはだいぶ読みやすくなったらしいが昔のはマジでしんどい

関数型と一纏めにされがちだけど関数型のデバッグがしんどいというのは遅延評価のデバッグがしんどいという話であることが多い気がする

54 :デフォルトの名無しさん:2019/04/17(水) 08:33:13.73 ID:1UuXcvbJ.net
いい面もある。だけど悪い面もあるよね。

55 :デフォルトの名無しさん:2019/04/17(水) 08:49:47.58 ID:8ss+sM3t.net
ああ正格じゃないとちょっとデバッグめんどくさそうというかどうすんだろ
ここ呼ばれるはずなのに呼ばれてない、呼ばれたと思ったけどこの値じゃネェェいつのだコレってなるのかな

56 :デフォルトの名無しさん:2019/04/17(水) 11:23:48.51 ID:VHrQPR5f.net
>>49
非純粋な関数型言語はデバッグし易いと思う。

Haskellはdo形式の複数行のプログラムが、モナドに直すと一行の式になるって言うのを意識しないと
$使って下の式全部も括弧で囲むと解釈される事があるから、理解不足の頃ハマってた。
後は型エラーが多いかな。
デバッガ頼りにするより、自分がその関数の挙動を理解してるか?がデバッグの近道。
コピペしてきても、そのコピペしたコードを理解してないとデバッグ出来ない。
シンドイけど、エラーが無くなったらほぼ思った通りに動く安心感はある。

57 :デフォルトの名無しさん:2019/04/17(水) 17:18:17.61 ID:bfpXtPq4.net
scalaは開発効率が悪いと言ってる記事見つけた。
https://grundlefleck.github.io/2013/06/23/using-scala-will-make-you-less-productive.html

やっぱり良く使われてる言語の方が、総合的に見て一番優れてるんじゃないかな
コンパイル時間の差とか、意外なところが問題になってくるから

58 :デフォルトの名無しさん:2019/04/25(木) 11:28:30.94 ID:4gUVed1M.net
ほしゅ

59 :デフォルトの名無しさん:2019/05/06(月) 12:34:41.53 ID:XhX25YOD.net
あげ

60 :デフォルトの名無しさん:2019/05/06(月) 15:54:43.11 ID:DF3zK1Xx.net
結局haskellの非正格評価はやりすぎってことだろ。
lispマクロみたいにちょこっと入れるくらいがちょうど良いってことだな。

61 :デフォルトの名無しさん:2019/05/10(金) 01:44:51.76 ID:UIKYLzF/.net
みんなすごいな

40越えたおっさんが先週「すごいHaskellたのしく学ぼう!」買ってきた。
ざっくり読んだけどおっさん、理解するのに3年くらいかかりそうだわw

ちなみにSICPは14ページ過ぎたあたりの練習問題で挫折して以来、20年くらい地下結界に閉じ込めている(おっさんが持つと頭がおかしくなって死ぬ)

62 :デフォルトの名無しさん:2019/05/10(金) 09:26:33.52 ID:8CEC/ybx.net
すごいHaskell〜は今でも名著やで

63 :デフォルトの名無しさん:2019/05/10(金) 09:49:04.27 ID:6xQjM2XG.net
>>60
コンパイル時に正格評価に部分的にしてるし(Haskellは全部非正格評価だと末尾再帰でもスタック消費する)、今後それを拡大しろって話もある。
並列処理のリストは正格評価にすべきとか、zipWithにもfoldl’みたいに正格評価版のzipWith’が欲しいとか。

64 :デフォルトの名無しさん:2019/05/10(金) 09:57:58.35 ID:6xQjM2XG.net
>>61
拙著で悪いが、すごいH本で挫折したらamazonでHaskell入門以前(108円)と言う電子書籍を売っているので、
それで手続き脳の価値観を関数脳にしてからの再挑戦を勧めます。

Haskellは、ほぼ数学エミュレータ。

65 :デフォルトの名無しさん:2019/05/10(金) 11:34:17.77 ID:sggjdX/2.net
>>64
108円だったら広告つけてwebで公開してくれません?

66 :デフォルトの名無しさん:2019/05/10(金) 12:05:43.35 ID:73mxg3RL.net
>>65
古事記乙

67 :デフォルトの名無しさん:2019/05/10(金) 15:09:33.91 ID:I6iky/qO.net
>>65
パブーでは長い事無料で公開してたのですが、パブーが潰れまして(T . T)
途中からamazonに合わせて108円にしましたが、パブーが潰れてなければ無料設定出来たので期間限定で無料化も出来たのですが。。。
(amazonでも無料にしたかったけど、項目が無く断念。最低価格の108円に)

パブーの編集機能で書いたので、それ以外の編集の仕方が分からず広告を付けるとかは出来そうにありません。。。

1人だけですが素人の作品に星を付けてくれて、お褒めの言葉を頂いているので108円の価値は一応あるのかな?と。

amazon何とかに入ってると108円のは無料で読めるらしいので、多分それで読んでもらったのでしょうが、
価格に見合った内容になる様に書いたつもりですが、こんな内容で108円は高いとか文句書かれてないのにホッとしてます。

5年で7000円の売上(期待してなかったので最近まで放置してた)ですが、一応そこそこ売れてます。
(108円だと70%が著者の取り分(価格によって取り分が違います)なので100冊は売れてる?)

68 :デフォルトの名無しさん:2019/05/10(金) 19:05:13.19 ID:sZdncDhC.net
>>67
Amazonってことはフォーマットはazw形式ですか?

https://jp.epubor.com/guide/kindle-azw3をpdfに変換/

https://github.com/coolwanglu/pdf2htmlEX
でhtmlに変換して広告入れるとかでうまくいかないでしょうか…
広告収入詳しくないけど5年で7000円なら上回れないかな?

69 :デフォルトの名無しさん:2019/05/11(土) 11:26:48.65 ID:k2bl7TQ1.net
>>63
いやだから言語としては非正格な仕様なのに実際の裏側では色々最適化してる
ってのがそもそもおかしいでしょって思わん?
明らかにチューンする際に変な手間とることになるし。
理屈が破綻してるとしか言いようがない。

70 :デフォルトの名無しさん:2019/05/11(土) 12:23:00.50 ID:ux5rNLyP.net
それ言ったらガベコレもおかしいよなって話になんじゃ

71 :デフォルトの名無しさん:2019/05/11(土) 12:51:13.43 ID:k2bl7TQ1.net
>>70
ガベコレはやってることがそこまで複雑ではない。
まあ最低限の知識はないと確かにリークさせるコードも書けるって問題はあるが。。
少なくとも評価順序の違いほど大きな影響のでるものじゃない。

72 :デフォルトの名無しさん:2019/05/11(土) 13:27:32.41 ID:ux5rNLyP.net
>>71
ガベコレも方式によっては途中で止まったりでパフォーマンスチューン難しくなって、その辺が正確がどうかとかと一緒だって話だよ。まあ程度は違うと思うけどな

73 :デフォルトの名無しさん:2019/05/11(土) 16:32:38.06 ID:PngNQXyb.net
>>68
新たに本を書くとかなら検討しますが、すでにお金を払ってくれた方が100人も居るとなると、
無料化はちょっと裏切り行為みたいな感じなので、辞めておきます。

無料にしたかったのを泣く泣く108円で売っていた通り、お金の問題では無く、買ってくれた人へのけじめとして。

74 :デフォルトの名無しさん:2019/05/11(土) 19:01:05.54 ID:ux5rNLyP.net
>>73
>>65みたいな奴の言う事相手にしなくていいと思うの

75 :デフォルトの名無しさん:2019/05/18(土) 11:10:41.62 ID:cPFyVnxJ.net
kotlinは関数型言語とは言われないと思うんだけど
関数型言語とそうでないものの目安って何かないかな?
厳密な部分は置いといて「この機能があれば」とか
「この実装がやりやすければ」的な目安になる要素はないのかな。
それとも言ったもん勝ちで実は大差ない感じ?

76 :デフォルトの名無しさん:2019/05/18(土) 11:38:39.42 ID:5J0Gqe9l.net
まあ結構テキトーだわな。
https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
この表にある「純粋」の項目が純粋なやつの方がより関数型だとは思うけど、
まともに使い物になるやつが全て「非純粋」ってのがなんだか皮肉。

77 :デフォルトの名無しさん:2019/05/18(土) 12:13:47.35 ID:2fCqfP5W.net
関数を引数にとれるか、そういう高階関数をユーザが自由につくれるか、だと思う。

78 :デフォルトの名無しさん:2019/05/18(土) 12:52:28.06 ID:9pyt4zVl.net
関数がファーストクラス、デフォルトイミュータブルとかかなあ

79 :デフォルトの名無しさん:2019/05/18(土) 12:57:23.98 ID:9pyt4zVl.net
関数を組み上げることでプログラムするってのが主方針になってるもの、で、そうすると
>>78みたいなものも付随して出てくる感

80 :デフォルトの名無しさん:2019/05/25(土) 01:20:17.82 ID:7Hh+Cor8.net
C言語の関数ポインタは高階関数になの?

81 :デフォルトの名無しさん:2019/05/25(土) 14:32:39.12 ID:zj5v3uWs.net
そも関数って扱いができないから、言語が関数をサポートしてるとは言えないんじゃ

82 :デフォルトの名無しさん:2019/05/25(土) 15:02:57.21 ID:UKk+E4BI.net
>>80
肝心の質問が誤記で何を訊いているのかわからないが

高階関数の引数になるの?→そういう高階関数があればなれる
高階関数(へのポインタ)になるの?→そういう高階関数があればなれる
高階関数の戻り値になるの?→一般的には無理。ファンクタのようにワンクッションおけば可

83 :デフォルトの名無しさん:2019/05/26(日) 09:30:17.43 ID:Suq0krAi.net
まあ関数クラスを無理やり作ればできるといえばできるな。
カリー化、関数合成あたりはクラス作成の良い例題になる気はする。
実装がめんどくさいのは非正格評価な部分。多分マクロ使うしかない。

84 :デフォルトの名無しさん:2019/08/20(火) 20:30:33.03 ID:PAXTwiB7.net
関数型言語を学びたいんだけど
まず最初に学ぶべきはscheme?

85 :デフォルトの名無しさん:2019/08/20(火) 22:32:53.21 ID:nrZG0qPb.net
まあいいんじゃ

86 :デフォルトの名無しさん:2019/08/21(水) 01:26:47.29 ID:7whQ/iRu.net
ループ文よりこれが数学風の書き方に近いと(VBA)
Function sum(n As Long) As Long
If n > 0 Then sum = n + sum(n - 1)
End Function
でもスタックオーバーフローが未解決なの?

ならGoToで
Function sum_go(n As Long) As Long
GoSum: If n > 0 Then sum_go = sum_go + n: n = n - 1: GoTo GoSum:
End Function
これじゃ数学風じゃない?

それでいいならこれでもいいじゃんね
Function sum_do(n As Long) As Long
Do While n > 0: sum_do = sum_do + n: n = n - 1: Loop
End Function
ループに戻ったねw(そもそもそれでいいとも言われてないが)

逆にプログラマから見れば、「条件判定で繰り返し」ってWileじゃんていう
それに、1+2+3…を10+9+8…にする方が捻くれてるようなw
でも数学者がループスパゲッティでイラっとする気持ちは分かる

87 :デフォルトの名無しさん:2019/08/22(木) 16:42:05.91 ID:WfRiJM9A.net
とりあえずschemeやってみる

88 :デフォルトの名無しさん:2019/09/01(日) 00:20:37.51 ID:3Spoi/4/.net
>>80
Cの関数は厳密には値を返すのは関数で、値を返さないのは手続きなんだけどね。。。
Pascalでは厳密に分けられてる。

89 :デフォルトの名無しさん:2019/09/24(火) 13:09:34.88 ID:fBblqCx3.net
schemeやるならSICPが理解できるようになろう
https://sicp.iijlab.net › fulltext
html版SICP - 計算機プログラムの構造と解釈 第二版

90 :デフォルトの名無しさん:2019/09/25(水) 00:32:03.89 ID:Vgi2baKA.net
>>88
関数型言語を使い始めるとあらためてPascalって偉大な言語だなと思う

91 :デフォルトの名無しさん:2019/10/07(月) 04:54:29.55 ID:fVAFOrwQ.net
C言語でステートレスな関数で関数ポインタとかも使いながらコーディングすると
関数型言語とほぼ一緒じゃないの?何が違うの?

92 :デフォルトの名無しさん:2019/10/07(月) 10:01:58.97 ID:q6F4KevL.net
C言語でイミュータブルとか頑張りたかねえな

93 :デフォルトの名無しさん:2019/10/07(月) 16:28:27.86 ID:fVAFOrwQ.net
イミュータブルかそうじゃないかって
いちいち新しい変数を使うか同じ変数を使い回すかでしかないでしょ?
そんなに重要?

94 :デフォルトの名無しさん:2019/10/07(月) 16:31:03.82 ID:fVAFOrwQ.net
そもそも関数を適切に設計したら20行以下になるし
イミュータブルな変数がそんなにコーディングを助けるか?

95 :デフォルトの名無しさん:2019/10/07(月) 19:02:05.28 ID:fVAFOrwQ.net
>>82
なんで関数ポインタを返す関数作れないの?
ポインタを返す関数は作れるみたいだけど、関数ポインタは無理ってこと?

96 :デフォルトの名無しさん:2019/10/07(月) 19:11:31.94 ID:fVAFOrwQ.net
やっぱりCで関数ポインタを返す関数作れるのでは?
"関数ポインタを返す関数"
これでぐぐったらたくさん出てくるよ。

97 :デフォルトの名無しさん:2019/10/07(月) 20:01:13.70 ID:w5Y5ng+E.net
>>91
正格評価な関数型言語とCだったら、Cでも頑張れば同じ様にはできると思う。
(言語としてイミュータブルに書きやすいかどうかの違い)

遅延評価の無限リストは正格評価な言語だと無限ループと等価だから、発想の転換が必要。

何度例として出したか分からないが…。
以下はCなどで言う無限ループなプログラムである。
注目すべきは"Hello World!!"を1文字ずつ消していくのと、["/","|","\\","--"]を順番に表示して回転してるように見せる処理を
Cでは無限ループの中でそれぞれ管理しないと行けない(片方はforに管理を任せられるが)が、Haskellはただ無限リスト同士をzipするだけである。

Haskellでは無限ループは無限リストとして線形に進み、Cではグルグル回る。
この例で、しいてHaskellで無限ループと言えるのは組込関数cycleの定義のみ。

cycle xs = xs ++ cycle xs

これは関数型かどうかではなく、正格評価か遅延評価かの違い。

import Data.List
import System

main = mapM_ put $ zip hellos marks

hellos = (cycle.tails) "Hello World!!"

marks = cycle ["/","|","\\","--"]

put (x,y) = do putStrLn (x ++ "\n" ++ y)
system "clear"

98 :デフォルトの名無しさん:2019/10/07(月) 20:11:15.35 ID:w5Y5ng+E.net
ごめん。
Cではそれぞれ管理しないと行けないと言うのは言い過ぎた。
cycleの無限リストは擬似的なリングリストだから、Cでもリングリストで管理不要だった。

99 :デフォルトの名無しさん:2019/10/07(月) 20:35:16.99 ID:fVAFOrwQ.net
遅延評価ねぇ・・・

・使われない値を関数の引数に渡すとしても、その値が既に計算されて存在しているなら大したロスではない。
・関数内部の条件分岐によって値を使うか分かれる場合でも
値を取得するための関数ポインタを渡しておけば、不要なら呼び出さなければいいだけ。
正格評価でも無駄な値算出を避けれる。

遅延評価の本質的メリットとは?

100 :デフォルトの名無しさん:2019/10/07(月) 20:47:58.16 ID:fVAFOrwQ.net
ネットワーク越しのDBサーバがあるとして
1回の通信でオブジェクトを取得しておくのと
オブジェクトの各値を遅延評価で必要になったものだけ取得するのと
どっちが効率が良いか?
後者は1つ1つの値のためにいちいち通信が生じる。

この問題はネットワーク越しでなくともある。
サブルーチンの呼び出しではスタックにローカル変数を積む等の処理があるはずで
僅かだがコストがある。
関連する値を一斉に算出/取得するのと、必要になった部分のみをいちいち算出/取得するのとどちらがいいか?

コンピュータにおける値の算出とは実質的にネットワークやストレージアクセスを通じた取得処理である事も多い。
時間のかかる計算的算出であれば回避するメリットは大きいが、
ネットワークやストレージの場合1度にまとめて取得しておいたほうが良い場合も多い。

47 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★