関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/
探検
関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/09/27(水) 02:33:08.70ID:2XAqPuH2
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の規模じゃそれを採用する利点はわからないけど
fizzbuzzの規模じゃそれを採用する利点はわからないけど
783デフォルトの名無しさん
2018/10/12(金) 08:45:23.98ID:gMRT6HYK むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」
「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:gMRT6HYK787デフォルトの名無しさん
2018/10/13(土) 06:54:47.20ID:KKBwY8Qn コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか
788デフォルトの名無しさん
2018/10/13(土) 07:37:36.01ID:dpKKSw3w789デフォルトの名無しさん
2018/10/13(土) 10:35:05.77ID:dM3fjinv 遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが
790デフォルトの名無しさん
2018/10/13(土) 18:49:50.11ID:hDWVpOOe Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。
791デフォルトの名無しさん
2018/10/13(土) 20:07:33.53ID:H67rAYXW メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし
ファイルに保存できた方が原因特定も楽だし
792デフォルトの名無しさん
2018/10/13(土) 20:11:57.62ID:KKBwY8Qn 評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね
793デフォルトの名無しさん
2018/10/13(土) 20:39:20.93ID:H67rAYXW データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか
某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#ではそのような記述があった 希ガス
Haskellでの優先順位について
・演算子の優先順位の記述はある
・関数適用の優先順位の記述はある
でも、関数の優先順位の記述が見当たらないんだけど(どっかに、左結合ってのはみた)
関数の優先順位はどうなるの?
要するに、かっこ付けの順番なんだけど
1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス
796795
2018/10/16(火) 00:16:52.78ID:J1KdR+sZ 795だけど、質問がうまくまとまってない希ガス
演算子と関数というのがあるけど、演算子も関数と見なしていいんだよね
ていうことは、
まず、第一の疑問は
1.関数適用の優先順位が高いとして、沢山ある関数(演算子も含む)の中でどの順番で行うのか?
第二の疑問として
3.関数 の優先順位は何?
例えば、compfunc = funcA . funcB (3 + 4)があった場合、最初の関数適用にfuncAと後ろの(.)が
が選ばれない理由でもいいかも
演算子と関数というのがあるけど、演算子も関数と見なしていいんだよね
ていうことは、
まず、第一の疑問は
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が関数だとか値のバインドだとか関係ない
そういう話ではない?
この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)))
だよね
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)になってないと思う。 (関数というか、カリー化は左結合)
それを真としすると
自分の理解では、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+sZ801デフォルトの名無しさん
2018/10/16(火) 01:38:23.70ID:iR5P4NYU >>796
演算子と関数とは似ているように思うかもしれないがちゃんと区別したほうがいい
まず関数適用とは雑に言えば項の間の半角スペースのこと
関数とか定数とか(ただし演算子は除く)をスペースでくっつけるのが関数適用
その関数適用の結合はカッコを除いて最優先なので、特に全ての演算子に優先する
(結合の仕方は>>797の通り)
そして
(.) :: (b -> c) -> (a -> b) -> a -> c
は慣れないうちは紛らわしいが、単に関数を引数に取る2項演算子なので
(演算子として使う限りは)関数適用より優先順位が低い
うーんいまいちちゃんと説明しきれてないし用語の使い方もアヤシイので
誰か詳しい人頼む
演算子と関数とは似ているように思うかもしれないがちゃんと区別したほうがいい
まず関数適用とは雑に言えば項の間の半角スペースのこと
関数とか定数とか(ただし演算子は除く)をスペースでくっつけるのが関数適用
その関数適用の結合はカッコを除いて最優先なので、特に全ての演算子に優先する
(結合の仕方は>>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。
正確には覚えてないんですが、Haskell の型宣言を省略した場合、コンパイラ、インタプリタがよきにはからってくれてなるべく適用範囲が広い型をつけてくれます。
でもそれは Top-Level ではダメって制約があったと思うんですが、この制約なんか名前ついてたとおもうんですがなんでしたっけ?
これなんの為にあるんでしょう?
これ外すための GHC のオプションがあった記憶もあるんですがわかります?
数年ぶりに Haskell つかったら昔とったハズの杵柄がボロボロに orz。
804デフォルトの名無しさん
2018/10/16(火) 07:09:37.73ID:t1I/4hrX805デフォルトの名無しさん
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
演算順序を決める丸括弧は展開出来ないよ
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/
Haskellの書き方としてイケてない書き方あったら教えてもらえたら嬉しいです
BASIC言語風のインタプリタです
https://csacademy.com/code/4vUVk5c9/
808795
2018/10/17(水) 09:26:31.84ID:NmM3N1fc なんとなくわかったというか 暫定でわかった
要するに”関数適用の優先順位は高い”なんだろうね
関数の優先順位の記述が無いのは、そのようなルールが不要だと思えばいいわけで。
かっこ付けのやるべき順序として
1.関数適用 部分適用が出来るなら強欲に
2.演算子の優先順位と結合性でかっこ付け
これで、かっこ付けが終わったので、シグネチャとの整合性を取ってみる。
あっていなければ、コンパイラーエラー
ということで、コンパイラーも理解出来そうなルールになっていそうだし、
>>806とも整合性が取れそうかな
要するに”関数適用の優先順位は高い”なんだろうね
関数の優先順位の記述が無いのは、そのようなルールが不要だと思えばいいわけで。
かっこ付けのやるべき順序として
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)
二項演算子の優先順位を実現するには別の処理が必要だけど
少なくとも関数適用と二項演算子の計算が並ぶことはない
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:NmM3N1fc812デフォルトの名無しさん
2018/10/17(水) 12:50:35.76ID:DKH+Jm9W >>811
どの言語をやるにしても、ちゃんとした理解には必要になるから頑張れ
どの言語をやるにしても、ちゃんとした理解には必要になるから頑張れ
813デフォルトの名無しさん
2018/10/17(水) 14:46:13.41ID:97sxRiiz >>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。
それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、
・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
分けていないコード大っ嫌い。
・高凝集度で低結合度なコードは好き。
逆は嫌い。
・1つの小さな仕事をさせている関数は好き。
いくつもの仕事をさせて肥えている関数は大嫌い。
・1つの役割だけをしっかり果たしているモジュールは好き。
ごった煮モジュールは大嫌い。
この基準でいくと、あなたのコードはまったくイケてない。
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。
それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、
・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関係なくて、設計論の話
大半はHaskell関係なくて、設計論の話
817デフォルトの名無しさん
2018/10/19(金) 22:13:22.28ID:8Ox5P+xa テストどうすんべとか、保守どうしようとか、合成できるようにしたいとか
考えるとええんやで(こなみ)
考えるとええんやで(こなみ)
818デフォルトの名無しさん
2018/10/20(土) 12:25:50.44ID:u8BRF3D8819デフォルトの名無しさん
2018/10/24(水) 13:56:56.60ID:eHXbzfVY +が正格で:が正格じゃないということの意味を教えてください。
820デフォルトの名無しさん
2018/10/24(水) 15:31:36.63ID:eHXbzfVY じこかいけつしますたw
821デフォルトの名無しさん
2018/10/30(火) 14:24:11.19ID:pQwXzgRa stack の lts-12.x にはなぜ Yampa パッケージがないんだろ?
11.x の頃はあったのに。
11.x の頃はあったのに。
822デフォルトの名無しさん
2018/11/02(金) 08:09:05.71ID:QsNsn2yU stackでhp2prettyってどうやってインストールするの?
823デフォルトの名無しさん
2018/11/02(金) 15:49:58.24ID:98olsR6p824デフォルトの名無しさん
2018/11/03(土) 07:37:57.15ID:KyIBYeD2 >>823
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
825デフォルトの名無しさん
2018/11/07(水) 13:48:52.85ID:VCaKs67w 以前の GHC.Stats モジュールには GCStats 型がありましたが、
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。
そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。
そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
826デフォルトの名無しさん
2018/11/09(金) 08:25:29.12ID:rrSKeTdW f :: a -> b -> c
このコロン以降の部分って、英語圏の人は何て発音してるの?
"a to b to c" で良いの? 不自然かな?
このコロン以降の部分って、英語圏の人は何て発音してるの?
"a to b to c" で良いの? 不自然かな?
827デフォルトの名無しさん
2018/11/09(金) 11:20:46.63ID:DHGOZxva 英語圏のコミュニティで日本人なんだけど。。。って質問した方が早いのでは。。。
828デフォルトの名無しさん
2018/11/09(金) 11:46:57.84ID:z1XmYBYX そもそも日本人はどう読むんだよ
829デフォルトの名無しさん
2018/11/09(金) 11:47:53.76ID:p9aTnaT/ a arrow b arrow c
call a, b, and c
call a, b, and c
830デフォルトの名無しさん
2018/11/09(金) 12:13:53.97ID:vhYIIJha 漫画と同じだろ
台詞は発音するが絵は発音しない
a b c以外は発音しない
台詞は発音するが絵は発音しない
a b c以外は発音しない
831デフォルトの名無しさん
2018/11/09(金) 15:06:42.54ID:gCUmlTjd エフはエーからビーからシー
って読んでるわ
って読んでるわ
832デフォルトの名無しさん
2018/11/09(金) 19:57:17.40ID:Rc4d95qg >>828
ほんそれ
ほんそれ
833デフォルトの名無しさん
2018/11/09(金) 20:22:07.58ID:rrSKeTdW834デフォルトの名無しさん
2018/11/09(金) 20:43:11.08ID:Rc4d95qg それって、そもそも発音する場面なんてあるか?
って意味じゃ・・・
つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
って意味じゃ・・・
つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
835デフォルトの名無しさん
2018/11/09(金) 21:02:46.92ID:XtklT8Hz 身近にハスケルの話しできる人なんかいないから発音したこと無いぜ
836デフォルトの名無しさん
2018/11/09(金) 23:03:09.33ID:TUe4RwSk Haskell使って仕事してる人に聞いてみるしかないな
837デフォルトの名無しさん
2018/11/09(金) 23:07:51.58ID:9yt5Xmdj >>834
えっと、びーと、えっと、しー
えっと、びーと、えっと、しー
838デフォルトの名無しさん
2018/11/09(金) 23:19:25.21ID:ThtHVzoQ いや〜ん エッチィ
839デフォルトの名無しさん
2018/11/10(土) 02:48:27.14ID:A3qdJv3l c9のhuttonとmeijerのlectureでは、huttonが a to b、meijerが
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい
(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい
(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間
840デフォルトの名無しさん
2018/11/15(木) 22:01:12.82ID:ExoyI5Rr 2つの型クラスの間に包含関係を付けるのに
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
841デフォルトの名無しさん
2018/11/15(木) 22:08:48.54ID:349+82Of 変数に再代入できる言語に
慣れきっている者の質問なのですが
[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。
ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]
fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)
-- reverse $ fn 0 ints1 []
慣れきっている者の質問なのですが
[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。
ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]
fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)
-- reverse $ fn 0 ints1 []
842デフォルトの名無しさん
2018/11/15(木) 22:24:44.73ID:jJzADtia scanl (+) 0 [1..8] では?
素人なのでわからないけど
素人なのでわからないけど
843デフォルトの名無しさん
2018/11/15(木) 23:19:14.92ID:5uoUpH2U 842です
foldで書いてみました
fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]
-- fn [1..8]
foldで書いてみました
fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]
-- fn [1..8]
844デフォルトの名無しさん
2018/11/15(木) 23:51:13.43ID:349+82Of845デフォルトの名無しさん
2018/11/15(木) 23:58:57.35ID:349+82Of846デフォルトの名無しさん
2018/11/16(金) 00:12:59.47ID:mACu1uNV 842です
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと
先輩諸兄のレスを待ってください
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと
先輩諸兄のレスを待ってください
847デフォルトの名無しさん
2018/11/16(金) 01:31:49.81ID:1zT7OHrw 何使ってもいいならData.Listのinitsを使って
map sum $ inits [1..8]
が楽チン。
map sum $ inits [1..8]
が楽チン。
848デフォルトの名無しさん
2018/11/16(金) 18:07:13.25ID:0oMzWKAu >>840
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ
>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ
>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs
849デフォルトの名無しさん
2018/11/16(金) 18:12:37.84ID:3YKNNj99 正直全然読みやすくないのだが、本当に読みやすくないのか俺が手続き脳なだけなのか判断がつかない
850デフォルトの名無しさん
2018/11/16(金) 18:56:19.39ID:0oMzWKAu >>849
qのところが(f q x)に替わって再帰してるだけだよ
scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10]
qのところが(f q x)に替わって再帰してるだけだよ
scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10]
851デフォルトの名無しさん
2018/11/18(日) 07:38:58.15ID:2lh9j78G if then elseを最近知った位の超初心者です。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。
kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても
kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld2 [1/2,1/2] [1/4,3/4]
<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?
モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。
kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても
kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld2 [1/2,1/2] [1/4,3/4]
<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?
モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
852デフォルトの名無しさん
2018/11/18(日) 08:49:53.03ID:FSPPo7pC if-then-else
で返り値の型が違う
で返り値の型が違う
853デフォルトの名無しさん
2018/11/18(日) 09:57:38.99ID:XromDw/4 >>852
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。
kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3]
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。
kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3]
854デフォルトの名無しさん
2018/11/19(月) 18:56:00.44ID:NOUcIUOi855デフォルトの名無しさん
2018/11/20(火) 08:29:50.51ID:kos1zZ3I 関数型プログラミングでログ出力ってどうやってるんですか?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
856デフォルトの名無しさん
2018/11/20(火) 10:01:49.03ID:jmuJusIM flush
857デフォルトの名無しさん
2018/11/20(火) 10:53:51.88ID:QMY+cuul Writerでは例外のようなものを投げることができないからもっと万能なモナドを使う
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
858デフォルトの名無しさん
2018/11/20(火) 15:05:53.63ID:Bz9DRyU5 エラーが起きないように組めばいい
859デフォルトの名無しさん
2018/11/20(火) 16:37:16.27ID:kos1zZ3I 素直に副作用のある言語で組めってことですね
了解です
了解です
860デフォルトの名無しさん
2018/11/20(火) 18:07:48.61ID:QMY+cuul Haskellにも副作用はある
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ
861デフォルトの名無しさん
2018/11/20(火) 18:35:37.40ID:kZ/DcFbd >>855
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。
862デフォルトの名無しさん
2018/11/20(火) 21:54:07.61ID:tqW5qw7T RWHの例外周りは古いからPCPH勧めないと
863デフォルトの名無しさん
2018/11/24(土) 12:20:05.11ID:dO0ZWwxC haslell2010.pdfによくでてくる記号なんだけど”⊥”ってどう意味ですか?
値とか型ぽいんだけど、すごいH本とかの索引にはそんなん無いし。
https://www.haskell.org/definition/haskell2010.pdf
値とか型ぽいんだけど、すごいH本とかの索引にはそんなん無いし。
https://www.haskell.org/definition/haskell2010.pdf
864デフォルトの名無しさん
2018/11/24(土) 13:06:50.85ID:4kdGLnPd 直交
865863
2018/11/24(土) 13:10:25.20ID:dO0ZWwxC 例えば、こんな書き勝たされてるんだけど
P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.
”⊥ otherwise”って何だろう?
P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.
”⊥ otherwise”って何だろう?
866デフォルトの名無しさん
2018/11/24(土) 13:16:55.35ID:A/C05uoV 数学やれようざい
867デフォルトの名無しさん
2018/11/24(土) 13:24:01.18ID:dO0ZWwxC ええええ 本当に直交って意味なの?
数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
868デフォルトの名無しさん
2018/11/24(土) 13:28:15.64ID:4kdGLnPd 独立
869デフォルトの名無しさん
2018/11/24(土) 13:38:59.48ID:tsQBCVAv870デフォルトの名無しさん
2018/11/24(土) 13:43:43.78ID:dO0ZWwxC871デフォルトの名無しさん
2018/11/24(土) 13:59:53.00ID:1C+vWWG1872デフォルトの名無しさん
2018/11/24(土) 14:01:51.50ID:1C+vWWG1873デフォルトの名無しさん
2018/11/24(土) 14:15:54.52ID:1C+vWWG1 take undefined [] = undefined ― 入力待ち(Carl + Cで強制終了必須)
take 0 undefined = []
⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。
take 0 undefined = []
⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。
874デフォルトの名無しさん
2018/11/25(日) 11:21:25.73ID:gET8Juo7 undef :: b -> a
undef ined = undef ined
これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる
undef ined = undef ined
これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる
875デフォルトの名無しさん
2018/12/03(月) 16:13:07.05 Haskell では明示的に instance 宣言しなければ、ある class の要件を充たしていることをコンパイラが認識してくれません
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳)
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳)
876デフォルトの名無しさん
2018/12/05(水) 06:15:37.43 GitLab へ引っ越すんですって?
877デフォルトの名無しさん
2018/12/11(火) 10:40:31.76ID:w4wbcBCq bsort [] = []
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)
バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)
バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。
878デフォルトの名無しさん
2018/12/11(火) 10:48:30.82ID:w4wbcBCq 動作はこんな感じ。
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]
最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?)
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]
最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?)
879デフォルトの名無しさん
2018/12/11(火) 12:12:51.51ID:b3hhTnN8 スタックがヤバそう
880デフォルトの名無しさん
2018/12/11(火) 13:48:28.37ID:w4wbcBCq [a] -> [b]な再帰関数はスタック消費しないよ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★2 [BFU★]
- 立憲・野田代表が主張 台湾有事答弁で「質問者批判は筋違い」「答弁がおかしい」「高市総理迎合のネット世論は危険」★4 [♪♪♪★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 日中関係悪化で「日本からもうすぐパンダがいなくなる」 中国SNSでトレンド1位に★2 [♪♪♪★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸 ★2
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸
- 【高市悲報】中国「国連安保理の許可なしに日本を攻撃可能だ」★2 [115996789]
- 【高市悲報】中国「国連安保理の許可なしに日本を攻撃可能だ」 [115996789]
- 【んな専🏡】華金もんなっしょいとはやれやれなのらね🍬(・o・🍬)🏰
- 歯科助手って胸当ててくるじゃん?
