関数型プログラミング言語Haskell Part31©2ch.net

1デフォルトの名無しさん 転載ダメ©2ch.net2017/09/27(水) 02:33:08.70ID:2XAqPuH2
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
https://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/

768デフォルトの名無しさん2018/10/06(土) 18:45:45.19ID:iQB6eFVs
サイモンペイトンジョーンズがFacebookいってたけどさ、
バック→Haskell
フロント→React
みたいな構成ってそんなメジャーなんやろか

769デフォルトの名無しさん2018/10/06(土) 20:53:46.19ID:py9kgJld
FacebookはちょっとしたツールをHaskellで作ってますよ、位だと思ってたが…

>>766
> 大手のHaskell導入報告が続いて沸いてる
気づかなかった。他にはどこが?

770デフォルトの名無しさん2018/10/07(日) 02:27:45.21ID:cvc83VBz
ツイ見ろ

771デフォルトの名無しさん2018/10/07(日) 08:23:56.85ID:VWepfHKo
誰の?

772デフォルトの名無しさん2018/10/09(火) 07:56:37.24ID:pc4ijCgO
MonadIO は抽象度が高くて万能すぎ、オーバースペックだよ。
そのせいで、関数の中で何やってるのかシグネチャからは分かりにくいし。
ということで、もっと細かく分けようぜ、という話。
https://chrispenner.ca/posts/monadio-considered-harmful

簡潔で分かりやすい。
こういうのパターンっていうのかな。

773デフォルトの名無しさん2018/10/09(火) 19:53:39.57ID:ikZDMvLJ
githubを見る限りではとても盛り上がっているとは・・・
https://github.com/trending?l=haskell
相変わらず○○をHaskellで書いてみました系のプログラムばかり

774デフォルトの名無しさん2018/10/09(火) 22:29:07.16ID:1168jJnj
なんてことないfizzbuzzもHaskellで書くと楽しくなっちゃうんだよな
初めてプログラムを書いたときのwkwkを思い出させてくれる、それがHaskell

775デフォルトの名無しさん2018/10/10(水) 00:27:00.44ID:mnDhwBuZ
Haskellでfizzbuzzをやろうとすると「数値か文字を出力する関数ってどうやるんだ?」
みたいなところでつまづきがち

776デフォルトの名無しさん2018/10/10(水) 06:58:53.24ID:h0OQje2u
>>772
似たようなことはpurescriptではデフォルト(だった?)

777デフォルトの名無しさん2018/10/10(水) 12:38:31.88ID:Gg6vIVej
数値を文字列型にすれば良い

778デフォルトの名無しさん2018/10/11(木) 01:03:51.12ID:g6Q8mWEK
HaskellでのFIzzBuzzってこんなかんじですか?

https://csacademy.com/code/e8XJJZyv/

779デフォルトの名無しさん2018/10/11(木) 12:44:03.11ID:kgTYxXGo
>>778
そこからガードとmapを覚えると、多分こんな感じ
https://csacademy.com/code/wAIR17mO/

780デフォルトの名無しさん2018/10/11(木) 22:20:09.94ID:BadrZ8Hx
結局は書く人本人が気持ちよくなる為の言語だね
パフォーマンスに優れるとかもないし

781デフォルトの名無しさん2018/10/12(金) 02:12:33.00ID:C3Ny8aXI
>>779
あーやっぱこれだね〜

782デフォルトの名無しさん2018/10/12(金) 07:44:29.57ID:KfUOHFbE
遅延ストリームを扱うならHaskellは速い方だろう
fizzbuzzの規模じゃそれを採用する利点はわからないけど

783デフォルトの名無しさん2018/10/12(金) 08:45:23.98ID:gMRT6HYK
むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」

784デフォルトの名無しさん2018/10/12(金) 19:09:14.98ID:dVwqKDFL
「Haskellは参照透明性を保証するために、最適化を犠牲にした。
そのため、高い冗長性によってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で鈍速である」

785デフォルトの名無しさん2018/10/12(金) 20:38:19.51ID:P1gVq1Zk
purescriptってどうなん?

786デフォルトの名無しさん2018/10/12(金) 20:52:35.33ID:gMRT6HYK
>>784
returnとpureのこと言ってんの?
returnとpureのこと言ってんのーーーーッ!!?

787デフォルトの名無しさん2018/10/13(土) 06:54:47.20ID:KKBwY8Qn
コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか

788デフォルトの名無しさん2018/10/13(土) 07:37:36.01ID:dpKKSw3w
>>787
ベテランになれば実用上問題ない程度には予測できるようになるんじゃね?

俺はまだまだ修行不足だけど

789デフォルトの名無しさん2018/10/13(土) 10:35:05.77ID:dM3fjinv
遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが

790デフォルトの名無しさん2018/10/13(土) 18:49:50.11ID:hDWVpOOe
Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。

791デフォルトの名無しさん2018/10/13(土) 20:07:33.53ID:H67rAYXW
メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし

792デフォルトの名無しさん2018/10/13(土) 20:11:57.62ID:KKBwY8Qn
評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね

793デフォルトの名無しさん2018/10/13(土) 20:39:20.93ID:H67rAYXW
データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか

794デフォルトの名無しさん2018/10/15(月) 21:26:01.71ID:e5ZigS6A
Nixってなに?

795デフォルトの名無しさん2018/10/15(月) 22:33:00.01ID:eL3fUBCp
くだらない質問で悪いけど質問させてほしい

Haskellでの優先順位について

・演算子の優先順位の記述はある
・関数適用の優先順位の記述はある

でも、関数の優先順位の記述が見当たらないんだけど(どっかに、左結合ってのはみた)
関数の優先順位はどうなるの?
要するに、かっこ付けの順番なんだけど

1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス

7967952018/10/16(火) 00:16:52.78ID:J1KdR+sZ
795だけど、質問がうまくまとまってない希ガス

演算子と関数というのがあるけど、演算子も関数と見なしていいんだよね
ていうことは、

まず、第一の疑問は
1.関数適用の優先順位が高いとして、沢山ある関数(演算子も含む)の中でどの順番で行うのか?

第二の疑問として
3.関数 の優先順位は何?

例えば、compfunc = funcA . funcB (3 + 4)があった場合、最初の関数適用にfuncAと後ろの(.)が
が選ばれない理由でもいいかも

797デフォルトの名無しさん2018/10/16(火) 00:29:51.00ID:Y+LwBtWJ
a b c d e fの並びは(((((a b) c) d) e) f)
このa,b,c,d,e,fが関数だとか値のバインドだとか関係ない

そういう話ではない?

798デフォルトの名無しさん2018/10/16(火) 00:34:17.39ID:Y+LwBtWJ
演算子を関数としてみなすなら
compfunc = funcA . funcB (3 + 4)
は関数として展開して
compfunc = (.) funcA (funcB ((+) 3 4))

compfunc = (((.) funcA) (funcB (((+) 3) 4)))
だよね

799デフォルトの名無しさん2018/10/16(火) 00:43:59.67ID:J1KdR+sZ
>>797
それを真としすると
自分の理解では、a : funcA b:(.) c: funcB d:(3+4)となるけど、
実際の計算は(((((a b) c) d) e) f)とあってないと思う。

compfunc = funcA . funcB . funcC (3 + 4)の方が分かりやすかったかもしれないけど
関数合成は (funcA . (funcB . funcC)) (3+4)だから (つまり関数合成は右結合)
(((((a b) c) d) e) f)になってないと思う。 (関数というか、カリー化は左結合)

800デフォルトの名無しさん2018/10/16(火) 00:47:21.87ID:J1KdR+sZ
>>798

>>799は無視してください。こっちの方が本質だから

うん、その場合なぜ、

funcAより、(.)を関数適用の優先順位を上げたのかが
自分の疑問といってもいいと思う

関数適用の優先順位が高いのはいいとして、
じゃあ、どの関数から関数適用をするの?というのが、私の疑問

801デフォルトの名無しさん2018/10/16(火) 01:38:23.70ID:iR5P4NYU
>>796
演算子と関数とは似ているように思うかもしれないがちゃんと区別したほうがいい
まず関数適用とは雑に言えば項の間の半角スペースのこと
関数とか定数とか(ただし演算子は除く)をスペースでくっつけるのが関数適用
その関数適用の結合はカッコを除いて最優先なので、特に全ての演算子に優先する
(結合の仕方は>>797の通り)
そして
(.) :: (b -> c) -> (a -> b) -> a -> c
は慣れないうちは紛らわしいが、単に関数を引数に取る2項演算子なので
(演算子として使う限りは)関数適用より優先順位が低い

うーんいまいちちゃんと説明しきれてないし用語の使い方もアヤシイので
誰か詳しい人頼む

802デフォルトの名無しさん2018/10/16(火) 01:48:57.45ID:R77VKNPD
haskellの構文のBNFを見てみればいいんでない?

803デフォルトの名無しさん2018/10/16(火) 03:22:14.15ID:q8KCyqRj
質問です。
正確には覚えてないんですが、Haskell の型宣言を省略した場合、コンパイラ、インタプリタがよきにはからってくれてなるべく適用範囲が広い型をつけてくれます。
でもそれは Top-Level ではダメって制約があったと思うんですが、この制約なんか名前ついてたとおもうんですがなんでしたっけ?
これなんの為にあるんでしょう?
これ外すための GHC のオプションがあった記憶もあるんですがわかります?
数年ぶりに Haskell つかったら昔とったハズの杵柄がボロボロに orz。

804デフォルトの名無しさん2018/10/16(火) 07:09:37.73ID:t1I/4hrX

805デフォルトの名無しさん2018/10/16(火) 14:35:49.92ID:4kzhBxnD
>>804
あざっす❗

806デフォルトの名無しさん2018/10/16(火) 16:03:37.14ID:Y+LwBtWJ
>>799
compfunc = funcA 1 2 . funcB 4 5 . funcC 5 6 $ funcD 7 8
とあったとき、まず演算子を越えずに関数適用
compfunc = ((funcA 1) 2) . ((funcB 3) 4) . ((funcC 5 ) 6) $ ((funcD 7) 8)
このあとで演算子の優先順位で計算

>自分の理解では、a : funcA b:(.) c: funcB d:( 3+4)となるけど、

a:(.) b:funcA c:(funcB (3 + 4)) だよ
そして a:funcB b: (3 + 4)
そして a:(+) b:3 c :4
演算順序を決める丸括弧は展開出来ないよ

807デフォルトの名無しさん2018/10/17(水) 03:18:56.29ID:QhFRNLWc
300行近くあるコードなんですが
Haskellの書き方としてイケてない書き方あったら教えてもらえたら嬉しいです
BASIC言語風のインタプリタです

https://csacademy.com/code/4vUVk5c9/

8087952018/10/17(水) 09:26:31.84ID:NmM3N1fc
なんとなくわかったというか 暫定でわかった
要するに”関数適用の優先順位は高い”なんだろうね

関数の優先順位の記述が無いのは、そのようなルールが不要だと思えばいいわけで。
かっこ付けのやるべき順序として

1.関数適用 部分適用が出来るなら強欲に
2.演算子の優先順位と結合性でかっこ付け

これで、かっこ付けが終わったので、シグネチャとの整合性を取ってみる。
あっていなければ、コンパイラーエラー

ということで、コンパイラーも理解出来そうなルールになっていそうだし、
>>806とも整合性が取れそうかな

809デフォルトの名無しさん2018/10/17(水) 09:28:42.96ID:NmM3N1fc
>>806さん いろいろThx

810デフォルトの名無しさん2018/10/17(水) 11:49:29.63ID:RJ0latBv
BNF見ればちゃんと分かる
https://www.haskell.org/onlinereport/haskell2010/haskellch3.html
単純化するなら
exp = exp1 | exp1 op exp
exp1 = exp2 | exp1 exp2
exp2 = var | (exp)
二項演算子の優先順位を実現するには別の処理が必要だけど
少なくとも関数適用と二項演算子の計算が並ぶことはない

811デフォルトの名無しさん2018/10/17(水) 12:47:09.36ID:NmM3N1fc
>>810
それが、関数適用とどう関係があるのか、俺には理解できない


とうとう俺もBNFを勉強するときが来たようだw
数年に1度、思い出したようにBNFがネックになるんだけどね
今まで避けてきたw

812デフォルトの名無しさん2018/10/17(水) 12:50:35.76ID:DKH+Jm9W
>>811
どの言語をやるにしても、ちゃんとした理解には必要になるから頑張れ

813デフォルトの名無しさん2018/10/17(水) 14:46:13.41ID:97sxRiiz
>>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。

それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、

・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
 分けていないコード大っ嫌い。

・高凝集度で低結合度なコードは好き。
 逆は嫌い。

・1つの小さな仕事をさせている関数は好き。
 いくつもの仕事をさせて肥えている関数は大嫌い。

・1つの役割だけをしっかり果たしているモジュールは好き。
 ごった煮モジュールは大嫌い。

この基準でいくと、あなたのコードはまったくイケてない。

814デフォルトの名無しさん2018/10/18(木) 00:55:40.72ID:EL1XNa21
>>813
あざっす!勉強になりやした!精進しやす!

815デフォルトの名無しさん2018/10/19(金) 20:20:03.11ID:XWoSmko3
>>813
そういうコードの設計センスはどうやって学んだのですか?

816デフォルトの名無しさん2018/10/19(金) 21:59:48.14ID:Jw4VQ9Ey
>>815
大半はHaskell関係なくて、設計論の話

817デフォルトの名無しさん2018/10/19(金) 22:13:22.28ID:8Ox5P+xa
テストどうすんべとか、保守どうしようとか、合成できるようにしたいとか
考えるとええんやで(こなみ)

818デフォルトの名無しさん2018/10/20(土) 12:25:50.44ID:u8BRF3D8

新着レスの表示
レスを投稿する