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

■ このスレッドは過去ログ倉庫に格納されています
2017/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/
2018/10/07(日) 08:23:56.85ID:VWepfHKo
誰の?
2018/10/09(火) 07:56:37.24ID:pc4ijCgO
MonadIO は抽象度が高くて万能すぎ、オーバースペックだよ。
そのせいで、関数の中で何やってるのかシグネチャからは分かりにくいし。
ということで、もっと細かく分けようぜ、という話。
https://chrispenner.ca/posts/monadio-considered-harmful

簡潔で分かりやすい。
こういうのパターンっていうのかな。
2018/10/09(火) 19:53:39.57ID:ikZDMvLJ
githubを見る限りではとても盛り上がっているとは・・・
https://github.com/trending?l=haskell
相変わらず○○をHaskellで書いてみました系のプログラムばかり
2018/10/09(火) 22:29:07.16ID:1168jJnj
なんてことないfizzbuzzもHaskellで書くと楽しくなっちゃうんだよな
初めてプログラムを書いたときのwkwkを思い出させてくれる、それがHaskell
2018/10/10(水) 00:27:00.44ID:mnDhwBuZ
Haskellでfizzbuzzをやろうとすると「数値か文字を出力する関数ってどうやるんだ?」
みたいなところでつまづきがち
2018/10/10(水) 06:58:53.24ID:h0OQje2u
>>772
似たようなことはpurescriptではデフォルト(だった?)
777デフォルトの名無しさん
垢版 |
2018/10/10(水) 12:38:31.88ID:Gg6vIVej
数値を文字列型にすれば良い
2018/10/11(木) 01:03:51.12ID:g6Q8mWEK
HaskellでのFIzzBuzzってこんなかんじですか?

https://csacademy.com/code/e8XJJZyv/
2018/10/11(木) 12:44:03.11ID:kgTYxXGo
>>778
そこからガードとmapを覚えると、多分こんな感じ
https://csacademy.com/code/wAIR17mO/
2018/10/11(木) 22:20:09.94ID:BadrZ8Hx
結局は書く人本人が気持ちよくなる為の言語だね
パフォーマンスに優れるとかもないし
2018/10/12(金) 02:12:33.00ID:C3Ny8aXI
>>779
あーやっぱこれだね〜
2018/10/12(金) 07:44:29.57ID:KfUOHFbE
遅延ストリームを扱うならHaskellは速い方だろう
fizzbuzzの規模じゃそれを採用する利点はわからないけど
2018/10/12(金) 08:45:23.98ID:gMRT6HYK
むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」
2018/10/12(金) 19:09:14.98ID:dVwqKDFL
「Haskellは参照透明性を保証するために、最適化を犠牲にした。
そのため、高い冗長性によってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で鈍速である」
2018/10/12(金) 20:38:19.51ID:P1gVq1Zk
purescriptってどうなん?
2018/10/12(金) 20:52:35.33ID:gMRT6HYK
>>784
returnとpureのこと言ってんの?
returnとpureのこと言ってんのーーーーッ!!?
2018/10/13(土) 06:54:47.20ID:KKBwY8Qn
コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか
2018/10/13(土) 07:37:36.01ID:dpKKSw3w
>>787
ベテランになれば実用上問題ない程度には予測できるようになるんじゃね?

俺はまだまだ修行不足だけど
2018/10/13(土) 10:35:05.77ID:dM3fjinv
遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが
2018/10/13(土) 18:49:50.11ID:hDWVpOOe
Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。
2018/10/13(土) 20:07:33.53ID:H67rAYXW
メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし
2018/10/13(土) 20:11:57.62ID:KKBwY8Qn
評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね
2018/10/13(土) 20:39:20.93ID:H67rAYXW
データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか
794デフォルトの名無しさん
垢版 |
2018/10/15(月) 21:26:01.71ID:e5ZigS6A
Nixってなに?
2018/10/15(月) 22:33:00.01ID:eL3fUBCp
くだらない質問で悪いけど質問させてほしい

Haskellでの優先順位について

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

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

1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス
796795
垢版 |
2018/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)))
だよね
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)になってないと思う。 (関数というか、カリー化は左結合)
2018/10/16(火) 00:47:21.87ID:J1KdR+sZ
>>798

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

うん、その場合なぜ、

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

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

うーんいまいちちゃんと説明しきれてないし用語の使い方もアヤシイので
誰か詳しい人頼む
2018/10/16(火) 01:48:57.45ID:R77VKNPD
haskellの構文のBNFを見てみればいいんでない?
2018/10/16(火) 03:22:14.15ID:q8KCyqRj
質問です。
正確には覚えてないんですが、Haskell の型宣言を省略した場合、コンパイラ、インタプリタがよきにはからってくれてなるべく適用範囲が広い型をつけてくれます。
でもそれは Top-Level ではダメって制約があったと思うんですが、この制約なんか名前ついてたとおもうんですがなんでしたっけ?
これなんの為にあるんでしょう?
これ外すための GHC のオプションがあった記憶もあるんですがわかります?
数年ぶりに Haskell つかったら昔とったハズの杵柄がボロボロに orz。
804デフォルトの名無しさん
垢版 |
2018/10/16(火) 07:09:37.73ID:t1I/4hrX
>>803
https://wiki.haskell.org/Monomorphism_restriction
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
演算順序を決める丸括弧は展開出来ないよ
2018/10/17(水) 03:18:56.29ID:QhFRNLWc
300行近くあるコードなんですが
Haskellの書き方としてイケてない書き方あったら教えてもらえたら嬉しいです
BASIC言語風のインタプリタです

https://csacademy.com/code/4vUVk5c9/
808795
垢版 |
2018/10/17(水) 09:26:31.84ID:NmM3N1fc
なんとなくわかったというか 暫定でわかった
要するに”関数適用の優先順位は高い”なんだろうね

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

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

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

ということで、コンパイラーも理解出来そうなルールになっていそうだし、
>>806とも整合性が取れそうかな
2018/10/17(水) 09:28:42.96ID:NmM3N1fc
>>806さん いろいろThx
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)
二項演算子の優先順位を実現するには別の処理が必要だけど
少なくとも関数適用と二項演算子の計算が並ぶことはない
2018/10/17(水) 12:47:09.36ID:NmM3N1fc
>>810
それが、関数適用とどう関係があるのか、俺には理解できない


とうとう俺もBNFを勉強するときが来たようだw
数年に1度、思い出したようにBNFがネックになるんだけどね
今まで避けてきたw
2018/10/17(水) 12:50:35.76ID:DKH+Jm9W
>>811
どの言語をやるにしても、ちゃんとした理解には必要になるから頑張れ
2018/10/17(水) 14:46:13.41ID:97sxRiiz
>>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。

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

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

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

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

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

この基準でいくと、あなたのコードはまったくイケてない。
2018/10/18(木) 00:55:40.72ID:EL1XNa21
>>813
あざっす!勉強になりやした!精進しやす!
2018/10/19(金) 20:20:03.11ID:XWoSmko3
>>813
そういうコードの設計センスはどうやって学んだのですか?
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
>>813
+1
http://d.hatena.ne.jp/k3_kaimu/
2018/10/24(水) 13:56:56.60ID:eHXbzfVY
+が正格で:が正格じゃないということの意味を教えてください。
2018/10/24(水) 15:31:36.63ID:eHXbzfVY
じこかいけつしますたw
2018/10/30(火) 14:24:11.19ID:pQwXzgRa
stack の lts-12.x にはなぜ Yampa パッケージがないんだろ?
11.x の頃はあったのに。
2018/11/02(金) 08:09:05.71ID:QsNsn2yU
stackでhp2prettyってどうやってインストールするの?
2018/11/02(金) 15:49:58.24ID:98olsR6p
>>822
stack install hp2pretty
でいける
2018/11/03(土) 07:37:57.15ID:KyIBYeD2
>>823
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
2018/11/07(水) 13:48:52.85ID:VCaKs67w
以前の GHC.Stats モジュールには GCStats 型がありましたが、
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。

そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
2018/11/09(金) 08:25:29.12ID:rrSKeTdW
f :: a -> b -> c
このコロン以降の部分って、英語圏の人は何て発音してるの?

"a to b to c" で良いの? 不自然かな?
827デフォルトの名無しさん
垢版 |
2018/11/09(金) 11:20:46.63ID:DHGOZxva
英語圏のコミュニティで日本人なんだけど。。。って質問した方が早いのでは。。。
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
2018/11/09(金) 12:13:53.97ID:vhYIIJha
漫画と同じだろ
台詞は発音するが絵は発音しない
a b c以外は発音しない
2018/11/09(金) 15:06:42.54ID:gCUmlTjd
エフはエーからビーからシー
って読んでるわ
2018/11/09(金) 19:57:17.40ID:Rc4d95qg
>>828
ほんそれ
2018/11/09(金) 20:22:07.58ID:rrSKeTdW
みんなありがと。

よう分からんから、自分を信じて "a to b to c" って言っておくわ。

>>828
べつに日本語で読まなくてもいいと思うが。
英語でいいんじゃね?
2018/11/09(金) 20:43:11.08ID:Rc4d95qg
それって、そもそも発音する場面なんてあるか?
って意味じゃ・・・

つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
2018/11/09(金) 21:02:46.92ID:XtklT8Hz
身近にハスケルの話しできる人なんかいないから発音したこと無いぜ
2018/11/09(金) 23:03:09.33ID:TUe4RwSk
Haskell使って仕事してる人に聞いてみるしかないな
2018/11/09(金) 23:07:51.58ID:9yt5Xmdj
>>834
えっと、びーと、えっと、しー
2018/11/09(金) 23:19:25.21ID:ThtHVzoQ
いや〜ん エッチィ
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
,は少しの間
2018/11/15(木) 22:01:12.82ID:ExoyI5Rr
2つの型クラスの間に包含関係を付けるのに
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
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 []
2018/11/15(木) 22:24:44.73ID:jJzADtia
scanl (+) 0 [1..8] では?
素人なのでわからないけど
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]
2018/11/15(木) 23:51:13.43ID:349+82Of
>>841 >>842
どうもありがとうございます。

驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。
845デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:58:57.35ID:349+82Of
>>843
どうもありがとうございます。

驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。
2018/11/16(金) 00:12:59.47ID:mACu1uNV
842です
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと

先輩諸兄のレスを待ってください
847デフォルトの名無しさん
垢版 |
2018/11/16(金) 01:31:49.81ID:1zT7OHrw
何使ってもいいならData.Listのinitsを使って

map sum $ inits [1..8]

が楽チン。
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
2018/11/16(金) 18:12:37.84ID:3YKNNj99
正直全然読みやすくないのだが、本当に読みやすくないのか俺が手続き脳なだけなのか判断がつかない
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]
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の部分はどう直せばいいのでしょうか?

モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
2018/11/18(日) 08:49:53.03ID:FSPPo7pC
if-then-else
で返り値の型が違う
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]
2018/11/19(月) 18:56:00.44ID:NOUcIUOi
型を合わせるだけなら
https://ideone.com/VBpsvO
もちろん実行時エラー
2018/11/20(火) 08:29:50.51ID:kos1zZ3I
関数型プログラミングでログ出力ってどうやってるんですか?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
856デフォルトの名無しさん
垢版 |
2018/11/20(火) 10:01:49.03ID:jmuJusIM
flush
2018/11/20(火) 10:53:51.88ID:QMY+cuul
Writerでは例外のようなものを投げることができないからもっと万能なモナドを使う
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
2018/11/20(火) 15:05:53.63ID:Bz9DRyU5
エラーが起きないように組めばいい
2018/11/20(火) 16:37:16.27ID:kos1zZ3I
素直に副作用のある言語で組めってことですね
了解です
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は持っておいた方が良い。
2018/11/20(火) 21:54:07.61ID:tqW5qw7T
RWHの例外周りは古いからPCPH勧めないと
2018/11/24(土) 12:20:05.11ID:dO0ZWwxC
haslell2010.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”って何だろう?
2018/11/24(土) 13:16:55.35ID:A/C05uoV
数学やれようざい
2018/11/24(土) 13:24:01.18ID:dO0ZWwxC
ええええ 本当に直交って意味なの?

数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
868デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:28:15.64ID:4kdGLnPd
独立
2018/11/24(土) 13:38:59.48ID:tsQBCVAv
https://ja.wikipedia.org/wiki/ボトム型
2018/11/24(土) 13:43:43.78ID:dO0ZWwxC
>>869
Thx ようやくまともな答えが

Haskellやってて面白いのが、新しい概念が増えていくのがうれしい 遅延評価とか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況