関数型プログラミング言語Haskell Part30at TECH
関数型プログラミング言語Haskell Part30 - 暇つぶし2ch397:デフォルトの名無しさん
17/05/07 01:09:26.23 875uFfQS.net
>>391
質問に答えるだけの知識を持ち合わせていないので一応コードだけ
intersect :: Eq a => [a] -> [a] -> [a]
intersect xs = filter (`elem` xs)
リスト内包表現でも書けるけど関数型っぽいのはこういう書き方なのかも

398:デフォルトの名無しさん
17/05/07 01:46:15.37 s5HwRSgU.net
>>391
チューリング完全という意味で、他言語とHaskellは等価というのが数学的な見方だな
もし言語が複数存在する原因を知りたいなら、数学的な見方はほとんど役に立たないな

399:デフォルトの名無しさん
17/05/07 02:07:21.95 J1yK9zIW.net
>>392
>>393
ありがとうございます
チューリング完全でさえあればそれ以上は計算モデルより言語仕様に合わせた方が良さそうですね
いろいろ試してみて、一番スマートに書けるように精進します
今のところHaskellが一番面白いです

400:デフォルトの名無しさん
17/05/07 13:16:11.57 J1yK9zIW.net
>>392
ちなみに、mapやfilterとリスト内包表記は内部的にはここが違うとか、パフォーマンスが
違うとか、あるいはこういうときはこっちの方がいいとかはあるのでしょうか?

401:デフォルトの名無しさん
17/05/07 16:32:45.84 YN83nmbH.net
リスト内包表記はconcatMapを使うからネストできる
[f x y | x <- xs, y <- ys, p x y]
== concatMap (\x -> concatMap (\y -> if p x y then [f x y] else []) ys) xs
パフォーマンスは実際にghcがどういうコードを吐くかだけど
そのままconcatMapでもmapやfilterと同じような最適化が行われるし
必要なければリストの結合も行われない

402:デフォルトの名無しさん
17/05/07 16:37:16.65 f0nSghKy.net
リスト内包のほうがパフォーマンスでるらしいけどHaskellのパフォーマンスチューンングは難しいから当分気にしないほうがいい
待ってる間に線形型で楽々チューニングできるようになるかもしれないし

403:デフォルトの名無しさん
17/05/07 16:58:43.74 3IJNEy2Z.net
>>396
>>397
ありがとうございます
ネストの有無などで自分なりに考えながら使ってみます

404:デフォルトの名無しさん
17/05/07 17


405::18:00.54 ID:m17h7+4k.net



406:デフォルトの名無しさん
17/05/07 22:35:33.72 t8zqh9+K.net
Web系でもいいのですが、フリーウェア(できればオープンソース)のアプリケーションで、
Haskellで作られたものって何かありますか?
Haskellプログラマだけでなく、一般の人も使っているもので。
もしくは、みなさんならHaskellでどんなアプリケーションを作ってみたいですか?

407:デフォルトの名無しさん
17/05/07 22:48:03.22 ESaiO+gS.net
Pandocあたりは比較的広く使われている印象

408:デフォルトの名無しさん
17/05/07 23:26:23.39 xgXJ2OQ8.net
あとはShellCheckだな。bash初心者はとにかくこれ使えって話題のシェルスクリプト更正ツールだ。

409:デフォルトの名無しさん
17/05/08 00:31:05.17 XyXCIute.net
オーケーグーグル
Haskellで日本語文字列(Shift-JISやEUC-JP)のファイルを正しく処理する方法

410:デフォルトの名無しさん
17/05/08 17:26:21.06 kaDHepSW.net
みんな夢がないね。
ぼくなんてHaskellプログラム一つでお城のような家が建てれたよ。

411:デフォルトの名無しさん
17/05/08 22:42:37.72 0FON9WNL.net
>>400です。
ありがとうございます。
Haskellで作られたアプリケーションの方は2、3個紹介されるかなと思ってましたので、
まぁ予想通りです。
ですが、作りたいアプリケーションのレスが1日経っても皆無なのは驚きました。
(>>403 がいまいち分からない。これは私へのレスですか?)
私は年賀状の宛名をデザインするWebアプリを作りたいと思い、
「Beginning Haskell」を読んでWebアプリの勉強中です。
皆さん、作りたいものは何もないんですか?
ゲームとかオーサリング系とか、マストドンをhackするツール(crackではなく)とか...

412:デフォルトの名無しさん
17/05/08 22:56:09.94 9wTmIyqX.net
GitHubとかでHaskellで検索かけりゃ何か出てくるんじゃねーの?

413:デフォルトの名無しさん
17/05/08 23:03:23.31 a/GZsbco.net
論理に基づく人工知能を作るならHaskellがぴったりじゃないかと思うんだけど、プログラミングの技能も論理学の知識もないから作れない
細々と勉強はしてるけど

414:デフォルトの名無しさん
17/05/08 23:31:16.69 Vtk8jBj4.net
自動イタ電器とか作れや

415:デフォルトの名無しさん
17/05/08 23:32:41.17 9whwcEDU.net
達人プログラマーになりたい欲求はあるけど何かを作りたいっていう欲求は薄いわ

416:デフォルトの名無しさん
17/05/08 23:43:37.38 iNFmh6sq.net
やはりゲームだな。あとはGUIアプリ。なにかのエディタのようなものがいいな。
Haskellで複雑な状態を扱うのは困難、と言ってる人らに反論したい。
実際のところはどうなのか想像する前に、まずはそういう状況に直面する必要がある。

417:デフォルトの名無しさん
17/05/08 23:49:55.75 iNFmh6sq.net
EmacsのプラグインもHaskellで書きたい。正格データと遅延データを色分けして表示できたら嬉しそうだ。
GHC API を使えばできるかもしれない。
なんにしてもHaskellでやりたい。俺はもうLispは嫌だ…

418:デフォルトの名無しさん
17/05/08 23:59:34.03 0FON9WNL.net
>>409
どういうことですか?
私が知っている達人プログラマ、要するにハッカーですが、
彼らはみな何かを作ってました(ます)。
なので、作ることに関心が無い達人プログラマというのが想像しにくいのですが。
あ、競技プログラミングのトッププレーヤーとかですか?

419:デフォルトの名無しさん
17/05/09 00:07:55.03 CfiI0NLl.net
>>411
Haskellでエディタ書いてくれ
common lispで書いたエディタもあることだし

420:デフォルトの名無しさん
17/05/09 00:12:52.22 PrpfKmLN.net
作る以外に改造とかに気合入れる人とかもいるんじゃね?

421:デフォルトの名無しさん
17/05/09 00:50:22.97 j9MX7/aM.net
>>413
今は外部言語でかけるしくみがあるから、エディタそのものを置き換えなくてもいいんだ。
それが現実的だと思う。Emacsのような巨大なものは厳しい。見上げるだけで首が疲れるよ。先人は偉大だね。

422:デフォルトの名無しさん
17/05/09 10:12:37.98 jmx2rYXI.net
>>400
写真が趣味だから、Jpegのカラー画像をモノクロやセピアに変換するツール作りたくてHackage漁ったら使い易そうなのがCライブラリ使ってるんで、そう言うの入れやすいLinux導入。
暇があったらチマチマ作りたいけど、暇がない。。。

423:デフォルトの名無しさん
17/05/09 11:12:04.61 TCAyfaNB.net
itchynyタソがcamを作った時、一部の画像ファイルが(ライブラリのせいで)読めないのに腹を立てて
だったらhaskellで書いてやると一念発起したのがcamh。いまでも活躍してます。
lesspipeに組み込むとか。ちなこれはimlib2を使ってるので大抵の画像は読める。

424:デフォルトの名無しさん
17/05/09 22:12:03.59 PrpfKmLN.net
haskellを業務でつかうような仕事に転職すればOK

425:デフォルトの名無しさん
17/05/09 22:21:49.15 kDNeTnk7.net
仕事では使わんが、概念というかエッセンスはめっちゃ役に立ってるな
興味本位で触っといて良かったとマジ思う

426:デフォルトの名無しさん
17/05/09 22:47:25.87 1T1N541v.net
>>419
その手の話ここで時々聞くけど、Haskellの何が何にどう役だったのか、
具体的な話を聞いたことが一度もない。
$$$な状況でHaskell未経験のヤツは***だったけど、経験者の俺は###できた、とか。
そういう事を具体的に語ったブログとか無いんかな?
英語でも構わないんだけど。

427:デフォルトの名無しさん
17/05/09 23:13:21.51 0m9lmeXL.net
比較するなら同一のものに対して、Haskell でのアプローチと
その他のアプローチをする必要があるので、
そんな贅沢な時間の使い方するやつはユーザ数が多くないと現れないんじゃないかな?

428:デフォルトの名無しさん
17/05/09 23:21:27.66 PrpfKmLN.net
tanakhにhaskellやっててよかった話を要求するか

429:デフォルトの名無しさん
17/05/09 23:24:21.68 xmCSMJsq.net
C++やC99以降みたいな「どこでも変数宣言」を嫌うようになった
宣言した位置と使う位置が離れるのは書き方が悪いからだ、というかなんか

430:デフォルトの名無しさん
17/05/10 00:12:52.35 HNykyFkL.net
高階関数を多用する様になったとか、関数の純粋さを気にして関数分割する様になったとか
設計やコードが以前より分かりやすくなってテストもしやすくなったと思う
カリー化や部分適用がもっと簡単に出来たらってモヤモヤする事も多いけど

431:デフォルトの名無しさん
17/05/10 02:17:13.25 k+Fw34TB.net
別に関数型プログラミングって今まで出来なかったことが出来るようになる手法じゃないしな
コードを直感的に書けるようにすることでプログラムの全体的な質を高める手助けをしてくれるような感じ
メリットを語れと言われたら一晩中でも絡めちゃ語れる

432:デフォルトの名無しさん
17/05/10 07:52:30.59 JBi0Fo4L.net
関数型とは月極、定礎に匹敵する巨大グループだがそれが存在する証拠はない
統計学的には母集団が実在する証拠を出す義務はない

433:デフォルトの名無しさん
17/05/10 18:59:47.60 oW0tCmUv.net
私は、Windowsで大きなランタイムとか必要なく
実行形式のバイナリを作れるのが助かってる。
小さいバッチプログラムとか。

434:デフォルトの名無しさん
17/05/11 05:52:26.63 0s1wVfC9.net
ghcmod-vimってstack環境で動かないのな

435:デフォルトの名無しさん
17/05/12 14:16:42.66 jiodGJOF.net
haskelは使わないけど関数型の勉強はすごいためになる
ライブラリが提供する地雷メソッド見抜けるようになった

436:デフォルトの名無しさん
17/05/12 20:57:00.05 nS2W/WX/.net
意識的にオブジェクトをモノイドにしたりするようになった

437:デフォルトの名無しさん
17/05/12 21:47:41.07 YH3Rdz9Y.net
皆の言う関数型の経験が生きた事をアドバイスしてるオブジェクト指向の本が出ないのは何故か

438:デフォルトの名無しさん
17/05/12 22:37:15.98 ZlSd19FP.net
本を書くのが楽な作業だとでも思ってるの?

439:デフォルトの名無しさん
17/05/12 22:41:48.24 QfK6Pl49.net
その内容で一冊書きたいならそれをテーマにした小説にしてページを埋めないとだな
いいものはみんな本になるはずという前提がそもそも間違ってる

440:デフォルトの名無しさん
17/05/12 22:48:49.78 YH3Rdz9Y.net
>>432
楽かどうかの話じゃなくて、皆の言ってる事はここ数年の関数型の特長じゃないじゃん
ずいぶん昔から変わらない関数型の特長でしょ
関数型のいいところを手続き型(オブジェクト指向)にも取り入れようとし出したのもかなり昔の話だし
なのに、ここ数日このスレで挙げられた事が本になっていないのが不思議なんだよ
和書はともかく洋書でも無いじゃん

441:デフォルトの名無しさん
17/05/13 00:09:37.73 7Z9U0QOC.net
ハスケル環境整えやすいのって

442:デフォルトの名無しさん
17/05/13 00:10:00.54 7Z9U0QOC.net
Windows debian?

443:デフォルトの名無しさん
17/05/13 00:14:42.17 hYOIVOdy.net
>>431
うーん。。。
関数型言語じゃなくても気を付ければ出来るし、それがデザパタとかMVC/MVVMになってるからじゃないかな。
だから関数型言語はエッセンスを触接理解するのに使って、実用は普通の言語。
特にHaskellはIOと純粋関数が分かれてるからコマンドアプリでさえファイル=M、コマンドアプリ=VM、コンソール(ターミナル)や出力するGUI部品=Vって非常に明確。
使ってて、ああ、MVVMってこう言うことかって思った。
何つーか、MVCよりもMVVMはもっとCを広く解釈してるからVMなんだなぁとか。

444:デフォルトの名無しさん
17/05/13 00:22:55.11 7Z9U0QOC.net
C++でわからんでJAVAで半分誤解して
ruby使ったときにオブジェクト指向理解したのとよく似てるな

445:デフォルトの名無しさん
17/05/13 00:27:18.79 hYOIVOdy.net
経験上思ったのはオブジェクト指向は先手先手で先を読んだ設計が重要。
(だからオブジェクト指向設計とかがプログラミング以外にも必要)
関数型言語はわりと行き当たりばったりでもどうにかなるし、それはオブジェクト指向じゃない普通の言語(CとかPascal)でも活かせる。
だから、メソッドチェーン使った宣言的なオブジェクト指向よりも泥臭い手続き的なプログラミングに新たな視点(設計の幅)を与えてくれる感じ。
(要するにメソッドの中身を書くときに役立つ)

446:デフォルトの名無しさん
17/05/13 00:33:36.39 qMDptb/r.net
OOPはプロパティの値を書き換えてなんぼ、インスタンスの振る舞いをメソッド内で完結させて
なんぼだからまぁそりゃメソッド内くらいにしか関数型のパラダイムは取り入れられないよね

447:デフォルトの名無しさん
17/05/13 00:50:28.11 7Z9U0QOC.net
>>439
プログラム組む前に紙と鉛筆でじっくり図書いたことないかえ?
ライブラリ使うだけの時も恐怖でそうしてた。

448:デフォルトの名無しさん
17/05/13 01:35:42.34 tHJGZUH8.net
>>431
二つ以上の言語を使いこなす事をアドバイスしてる本ならあるよな
例えばシェルスクリプトとC言語の二つ
ここらへんではオブジェクト指向は必要ないし

449:デフォルトの名無しさん
17/05/13 11:47:21.81 LpfjHhl9.net
>>436
stack使うならどっちでも楽じゃない?

450:デフォルトの名無しさん
17/05/13 15:11:20.18 7Z9U0QOC.net
>>442
ほとんど知識のないまっさらの状態
ならそうだけど、
Cは覚えること山ほどあるぞ

451:デフォルトの名無しさん
17/05/13 17:01:20.26 GwlKz+MG.net
シェルはCのmain関数を呼び出すだけだからよかった
なぜmainではない任意の関数を呼び出す必要がないのか
なぜHaskellはCの任意の関数を呼び出すのか
答えを暗記する前によく考えてみれば、覚えることが減るんじゃないか

452:デフォルトの名無しさん
17/05/13 17:27:12.08 1EsAZpPG.net
Cよりjavaの方が覚えること多いよ

453:デフォルトの名無しさん
17/05/13 22:08:08.69 GC0/nJum.net
>>440
うーん。。。
上手く説明しきれてないな。。。
メソッドの中身書いてる時、手続き的なコード書く事多いけど、
設計変更の際に手続き的なコードだと破綻して新たにクラスを作ってオブジェクト指向的なコードに変える事があるんだけど、Haskell視点が入る事で一見破綻したコードでも、何とか破綻させずに改修できる目処が立つ事が増えた。
何つーか、手続き的なコードからオブジェクト指向的なコードへの切り替えを遅らせる。
手続き的なコードを延命する事が出来るようになったって感じかな。

454:デフォルトの名無しさん
17/05/13 22:42:27.32 Xpw0Rhcm.net
>>446
Cはコンパイラというかリンカのオプションが多い
JITコンパイラは覚えることが少ない

455:デフォルトの名無しさん
17/05/13 22:59:11.16 qMDptb/r.net
Javaはデザパタも覚えなきゃ話にならんから…

456:デフォルトの名無しさん
17/05/13 23:34:24.50 ZYwAYCy+.net
Haskellは初めからデザパタを、それと気づかないまま強制されているような窮屈さを感じる

457:デフォルトの名無しさん
17/05/13 23:36:04.40 GC0/nJum.net
それが仕事に活きるとも言える。

458:デフォルトの名無しさん
17/05/14 06:27:15.50 dFKyOZwr.net
代数的データは単なるVisitorパターンではなく遅延評価にも関係がある
だが同時に、型クラスで抽象化しろ、具体的な代数的データを教えるなというのがやばい

459:デフォルトの名無しさん
17/05/14 14:24:30.77 pHcsRThm.net
ポイントフリースタイルにこだわった方がHaskellっぽいですか?
flip関数まで使い出すと非常に混乱するのですが…

460:デフォルトの名無しさん
17/05/14 15:12:47.10 9JtdGcan.net
>>453
その考え方は本末転倒だと俺は思うよ。
プログラムコードで大事なのは関数型っぽいとか手続き型っぽいとかじゃなく、
プログラマ(自分)が読みやすい、意味が理解しやすいかどうかだよ。
Haskell を使うんだから関数型に合ったアルゴリズムはこだわるべきだけど、
その実装方法、つまり書き方は自分が読んで分かるように書こう。
そんな事はないだろうが、くれぐれもカッコイイとかで流されないように。
ただ、他人のコードは読めるようになった方が良いから、
そういう意味では多少トリッキーなポイントフリーにも慣れておいた方が良いかもね。

461:デフォルトの名無しさん
17/05/14 15:23:34.69 pHcsRThm.net
>>454
ありがとうございます
アルゴリズムを気にしながらもまずは自分と他人が読みやすいように書いていきます

462:デフォルトの名無しさん
17/05/14 16:43:02.99 uk0JawvS.net
プロっぽいコード書いて収入上げる

463:デフォルトの名無しさん
17/05/14 16:43:13.34 p/Ra2wac.net
ポイントフリーはこれが本質的な処理だ!おれは本質的なことだけ書くぜ!というカッコ良さがあるからな
珠玉のアルゴリズムとか読むと、つい憧れてしまう
しかしflipを使いまくって解読不能にするのは本末転倒

464:デフォルトの名無しさん
17/05/14 18:19:44.55 lQnp4gVk.net
flipの呼び出しコストって無視できるの?

465:デフォルトの名無しさん
17/05/14 18:24:38.81 I4CZOOoh.net
uncurryなんかもカッコいいなぁ (かなり使った
ただポイントフリーは、一度くっつけたのをまたバラす時に頭が痛くなる
一種の(視覚的な)最適化なので、頻繁に組み替えてる最中にはやりたくない

466:デフォルトの名無しさん
17/05/14 19:03:34.66 X8FkgiaC.net
>>458
最適化でインライン展開されるんじゃない?

467:デフォルトの名無しさん
17/05/15 00:57:14.99 ICbTDVni.net
ポイフリしたら型シグネチャ添えてる。本末転倒かね?

468:デフォルトの名無しさん
17/05/15 06:58:21.61 3pbiASso.net
>>461
それを本末転倒かもと考える事が本末転倒だよ。
大事にするところがおかしい。
コードスタイルを決めるのは何にもまして読みやすいか、考えやすいかどうかだよ。
(もちろん誰が読む、考える人かによる)
型シグネチャを添えるかどうかは本質的にはポイントフリーしたかどうかに関係ない。
・そもそも添えないと(意図したように)コンパイルできないから添える。
・添えた方がコードを読みやすい or 考えやすいから添える。
・添えない方がコードが読みやすい or 考えやすいから添えない。
これ以外の理由ってある?
(書籍に載せるのに紙面を節約するため、という理由は排除)
ちなみに俺個人は、添えた方が読みやすいし考えやすい。
どんな関数でも本体を定義する「前」に型シグネチャを書く(と言うか思い浮かべる)。
OOPにおけるインターフェース志向設計みたいなもの。

469:デフォルトの名無しさん
17/05/15 08:50:26.75 fFRu606n.net
いやおかしくないでしょ。
ポイントワイズなコード にするか、型シグネチャ付けるかは悩んでもいいでしょ。
コードは短い方が読みやすい。冗長でない方が読みやすい。
しかし一時変数や型注釈は別のレベルでの理解しやすさを与えてくれる。
それらを使うか、使うならどっちか、両方か、はケースバイケースだし職人芸的な深みがあると思うよ。
場合によっては関数名の類似だけで事足りることとかあるでしょう。
個人的なバランス感覚としては、なるべくポイフリするがflipは使わない、トップレベルの型シグネチャはほぼ付ける、ただし書き捨てコードは別。
(ルークよ、セクションを使え…)

470:デフォルトの名無しさん
17/05/15 09:43:58.61 WwceF0p9.net
使い捨てやモナドの途中でletした関数も漏れなく型シグネチャ付けるの?

471:デフォルトの名無しさん
17/05/15 10:00:25.10 3pbiASso.net
>>464
俺(>>462)に言ってるのかな。
俺は内部関数にはシグネチャーは基本的に書かない。
(内部関数自体、ほとんど使わないけど)
ごめん、どんな関数でもと言ったのは、トッブレベル関数のことだ。
あと、今のコーディングスタイルにしてからは、
Haskellでいわゆる使い捨てコードというものを書かないようになった。

472:463
17/05/15 11:04:15.21 fFRu606n.net
>>464
俺は書くときもある。でもそういう時は大抵、設計を練り直すハメになる。
なるべく上の層を充実させたいよね。
>>465
使い捨てコード書かないのは、どうなんだ。
ちょっとした実験というかお遊び的プログラミング、粘土コネコネはしないのかい。
いやでも、作っても結局設計しっかりしてないと長持ちしないなら、初めから気合い入れて製作すべきなのか。
その方がトータルのコストは節約できるということか。ううむ。

473:デフォルトの名無しさん
17/05/15 11:55:36.63 3pbiASso.net
>>466
実験は基本的にちょっとしたものでも捨てない。
結果的に後で捨てることになるかもしれんが、
捨てるつもりで実験はしない。
実験の目的や結果などをメモって残しておく。
実験の時も本番の時も思考の順は同じだから、まず型から考える。
だからシグネチャは書く。
お遊びは、ごめん、その状況がよく分からん。
コードを書くことを遊びにできる心は、揶揄でも何でもなく素直に感心する。
羨ましい。
粘土は要するに実験と同じだよね。
だからシグネチャは書くよ。

474:デフォルトの名無しさん
17/05/15 12:23:22.28 19VlPgPR.net
入門者のおれには勉強になる。
Stateとか使って型推論させると、MonadState使ったかなり複雑なシグネチャが出てくるんだけど、
あれはなるべく汎用的なシグネチャにしておくのがいいのかな?それとも具体的なシグネチャにするほうがいい?

475:デフォルトの名無しさん
17/05/15 12:29:59.58 Nyf5aX+C.net
>>465の言ってる「使い捨てコード」は単に無名関数くらいの意味合いじゃない?

476:デフォルトの名無しさん
17/05/15 13:07:35.87 3pbiASso.net
>>468
そりゃ、汎用的な関数を定義したかったら汎用的なシグネチャを書くし、
具体的な関数を定義したかったら具体的なシグネチャを書くよ。
モナドトランスのスタックがいつく積まれていようが関係ない。
あと、スタックがいくつも積まれた姿を常に目にしていると思考しにくい時もある。
そんな時は type で別名を付けて分かりやすくする。
すべては自分が考えやすく、書きやすく、読みやすくするため。
>>469
無名関数にシグネチャって
map ((\x -> if even x then 1 else (-1)) :: Integer -> Int) [1..9]
みたいにか?
それは無いでしょ。
>>464 がそんなことを聞いてるとは思えん。
まぁ、書かなきゃコンパイルできない場合もあるかもしれんが、
今のところ、そんな状況になったことは一度もない。
>>464 のレスを見て俺が想像した使い捨てコードはまさに >>466 の言うような「捨てる前提の実験コード」だよ。
それはやらなくなったから >>465 で捨てコードは書かなくなったと言ったんだ。

477:デフォルトの名無しさん
17/05/16 23:36:00.24 qM3Y9DLE.net
圏論を学んでみたい Haskeller、学ぼうとしたけど入門辺りで挫折してしまった Haskeller へ。
「圏論勉強会」なる一連の動画が youtube にアップされている。
(第13回まであって、それぞれ約2時間ある)
何年か前からアップされているので、知ってる人も多いと思う。
時々、Haskell で表現するとこんな感じ、といって実演して見せてくれるから面白いし、理解しやすい。
第1回はイントロダクション的な回で、圏論の雰囲気を掴むのが目的だから浅くサクサク進んでしまう。
だから難しく感じるのは当たり前なので、ここで諦めてしまわないように。
第2回からは圏論を学ぶ前の準備的な話からゆっくり丁寧に進むので安心して。
とりあえず全部一気に流して見て、2周目からじっくり学びながら見よう、
という学習スタイルはおすすめしない。
それだと1周目はテレビを何となくダラダラ見るのと同じで、何も理解できず、2周目に繋がらない。
(書籍なら自分のペースで読めるので、このスタイルでもいいと思うけどね)
それでは時間の無駄で、それなら初めから2周目のつもり挑んだ方がいい。
細かく一時停止して、今の話本当に理解できたかな、どこが理解できなかったんだろ、
といちいち理解度を確認しながら見ること。
また、動画内で例がいっぱい出てくるけど、自分でもオリジナルの例を作ってみるといい。
理解できたあかつきには、圏論はもちろん、Haskell がもっと面白くなる事を保証する。

478:デフォルトの名無しさん
17/05/16 23:59:22.93 Jwz5jkYk.net
圏論が分からん? 頭悪過ぎだろ。
まあコーダーなんてそんなもんかw

479:デフォルトの名無しさん
17/05/17 00:22:14.16 aIm9uZNt.net
圏論どうこう以前に文系出身だから数3Cすらわからんわ
すまんな

480:デフォルトの名無しさん
17/05/17 02:00:03.36 v4KZ2kPE.net
数学教室 πの焼き方 日常生活の数学的思考って本が圏論入門以前としては良いかも。
触り程度だけど、圏論出てる。

481:デフォルトの名無しさん
17/05/17 03:53:13.08 t193iX6C.net
さわりの誤用警察だ! 大人しくしろ!

482:デフォルトの名無しさん
17/05/17 09:13:07.50 DVfwNdKJ.net
Haskell固有のコーディングスタイルって何種類くらいあるの?それらのスタイルに名前あったりするの?

483:デフォルトの名無しさん
17/05/17 09:48:25.92 mHKUfv3k.net
shadowingも再代入できないから'を連打するパターン

484:デフォルトの名無しさん
17/05/17 09:51:42.83 uSaEsMW/.net
>>476
Haskell固有のコーディングスタイルって何?
たとえはどんなの?

485:デフォルトの名無しさん
17/05/17 10:55:39.88 knf86SYT.net
圏論のアイデアを盗むのは難しくない
盗用しても、そんなの圏論じゃないから盗作じゃないもんみたいな反応なので盗み放題

486:デフォルトの名無しさん
17/05/17 21:31:17.54 yFIpJ9bF.net
>>471
いい大人が2時間x13回なんて時間取れるかよ!ぼーっと見てるだけなんてダル過ぎ
…でもありがとう

487:デフォルトの名無しさん
17/05/17 22:56:48.03 Noyf0zx+.net
>>476
まだ関数脳が出来てない時は、副作用のない関数でも手続き的な書き方するけど、関数脳が出来上がったら自然と宣言的に書いていくから、コーディングスタイルと言えるようなのは段階を踏んで成長していくもの。
そう言うのじゃなくてインデント以外にも書き方あるのかと言われれば、ある。
ブレース構文と呼ばれるCっぽい書き方。
main = do { cs <- getContents;
putStr cs}
こっちはインデントに左右されない自由に書ける。
レイアウトまたはオフサイドルールと呼ばれる書き方はPythonと同じ、インデントを考慮しないとコンパイル出来ない。
こっちが主流。
ちなみに、ポイントフリースタイルはコーディングスタイルではなく、カリー化の部分適用で見た目の引数を減らす関数の書き方。

488:デフォルトの名無しさん
17/05/18 00:25:41.41 XBCR7g9y.net
x:xs みたいな変数名の使い方ってHaskell的だよね
関数名に意味を込めておいて変数名は短く簡潔な方がいいみたいなスタイル

489:デフォルトの名無しさん
17/05/18 00:27:12.80 xYh7ZO1T.net
>>476
GitHub - jaspervdj/stylish-haskell: Haskell code prettifier
URLリンク(github.com)
GitHub - commercialhaskell/hindent: Haskell pretty printer
URLリンク(github.com)
GitHub - evolutics/haskell-formatter: Haskell source code formatter
URLリンク(github.com)

490:デフォルトの名無しさん
17/05/18 00:38:06.79 EVp+48v/.net
Haskellの関数のアリティは常に1なので「カリー化」も「部分適用」も存在しない

491:デフォルトの名無しさん
17/05/18 02:12:52.06 yXJEanSW.net
Text.Printfのprintfはスゴイことをやってることはわかる
いまだに似たようなものを書くことができない

492:デフォルトの名無しさん
17/05/18 03:37:21.45 /F28r+D1.net
>>482
引数の時点で使いたい構造に分けておくのは気に入ってる。
使わない部分は'_'で明示出来るし。
f xs -- リスト全体
f (x:xs) --リスト先頭と残り
f xxs@(x:xs) -- リスト全体とリスト先頭と残り同時利用
f (x:y:zs) -- リスト先頭から2個と残り

493:デフォルトの名無しさん
17/05/18 03:42:59.76 znop8OGf.net
遅延評価分かってるつもりだったけど分かってないな
オライリーの並列本で、次のような式があって、force使ってたら並列処理に回される前に評価されて意味無いんじゃって思ってしまった
rpar (force (map solve as))
これって、rpar引数の式が式のまま引数として渡されて、rparが並列処理内で引数を評価しようとしたタイミングでmapとforceが評価されるって理解でいいのかな?
値の遅延評価は何となく頭に入ってたけど関数の評価については意識できてなかった

494:デフォルトの名無しさん
17/05/18 07:48:58.07 u6B8rj4W.net
rparが来た時点で次のrpar,rseqと並列に実行し始めるという風になってるから遅延評価とは違う?ような気がする
引数を正格にするのは単に並列化済みのそれぞれの処理を速くしたいという意図では

495:デフォルトの名無しさん
17/05/18 07:52:51.48 fP2O3mzY.net
force自体の評価は遅延されるからね
式はまだ評価されてない値と考えればいい

496:デフォルトの名無しさん
17/05/18 07:58:02.16 ZMFFk1e9.net
パターンマッチの分岐を確定するのに必要な分だけ評価する
Identityモナドみたいなやつでも⊥ではないことを確定する必要があれば評価する

497:デフォルトの名無しさん
17/05/18 08:06:27.16 u6B8rj4W.net
ではなく、評価の深さに関係してるみたいですね。rparがWHNFまでしか評価しないので。rseqでも同じかな?

498:デフォルトの名無しさん
17/05/18 08:12:32.69 u6B8rj4W.net
>>491>>488に対してです。
>>489
それでは、rseqが呼ばれるまでrparの引数が評価されないように感じるんですが、いつ評価が始まるんでしょうか?

499:デフォルトの名無しさん
17/05/18 08:41:17.48 IzAvSK7+.net
やるなら並列にやる(いつやるとはいってない)

これが初心者キラー

500:デフォルトの名無しさん
17/05/18 09:02:29.66 fP2O3mzY.net
>>492
forceという関数そのものは特別扱いされないって意味
ちなみにrpar自体が引数をWHNFまで評価すると理解してるけど試せる環境がないから断言は出来ないな
forceが必要なのもWHNFの時点でrparのスパークが終わっちゃうからだと思ってるけど・・・

501:デフォルトの名無しさん
17/05/18 12:53:58.06 hXrMTvib.net
>>482
関数自体の汎用性とか短さも関係してると思う
変数名が具体的でなくとも何してるかパッと見てわかる関数は嬉しい

502:デフォルトの名無しさん
17/05/18 14:10:00.91 TSzqrQQ0.net
>>487
forceはリストの背骨までしか評価しない。
つまり
xs=[1,2,3,4,5]

xs=[_,_,_,_,_]
と評価される。
でも、そのforceもリストが評価されるまで動かない。。。
マジで並列化と遅延評価は相性悪い。

503:デフォルトの名無しさん
17/05/18 15:07:11.90 S+9vOUwt.net
いやControl.DeepSeqのforceは再帰的に評価する
というのもリストのNFDataインスタンスはNFData a => NFData [a]だからね
head $ head $ force [[1,undefined]] はエラー

504:デフォルトの名無しさん
17/05/18 17:35:00.25 znop8OGf.net
force自体は何も特別では無くて遅延評価される
但し、force関数の評価時に本来はWHNFまでしか評価しない状況でもNFまで完全評価するって感じか

505:デフォルトの名無しさん
17/05/20 05:58:24.02 7XmC+xMs.net
URLリンク(faithandbrave.hateblo.jp)
GADTs拡張で、空でないリストを前提にコーディングできるみたいですけど、
これって、静的に空でない事が判明してないと呼び出せないんですか?
空か入ってるか判らないリストについては使えないってこと?
凄い使いにくそう

506:デフォルトの名無しさん
17/05/20 06:15:33.02 eorHP7jS.net
NonEmptyは何かしらのモデリングを行うときにパラメータが非空リストであるといった内部で生じる条件を明に扱えるようにするためのものかと思ってる
インポートした関数をつなぎ合わせるだけの部分で便利なものではない

507:デフォルトの名無しさん
17/05/20 18:25:30.00 SgRoQNx5.net
printf関数は副作用のある出力関数じゃなくて、フォーマット済みの文字列返すだけの副作用のない関数にして欲しかった。。。

508:デフォルトの名無しさん
17/05/20 18:29:29.96 1KTJ7Tkv.net
sprintfよろ

509:デフォルトの名無しさん
17/05/20 18:59:49.62 SgRoQNx5.net
本当、それ欲しい->sprintf

510:デフォルトの名無しさん
17/05/20 19:27:54.16 3Ne2dZP6.net
import Text.Printf
genMsg :: String -> String
genMsg name = printf "Hello, %s-san!" name
main :: IO ()
main = do
  name <- getLine
  putStrLn $ genMsg name

511:デフォルトの名無しさん
2017/05/2


512:0(土) 20:25:36.74 ID:HYrvvmg5.net



513:デフォルトの名無しさん
17/05/20 20:37:45.54 /vBlyS11.net
printfはほんと実装どうなってんのって感じ

514:デフォルトの名無しさん
17/05/20 20:41:46.24 HYrvvmg5.net
実装自体はHoogleで調べたら見れるけど、見ても分からんかった記憶がある。

515:デフォルトの名無しさん
17/05/20 21:15:44.41 ZfDONXvK.net
a=>PrintfArg、b=>PrintfTypeのとき、
String -> bはPrintfTypeである
a -> bもPrintfTypeである
StringもPrintfTypeである
IO ()もPrintfTypeである
…を繋ぐと動くんだったかな

516:デフォルトの名無しさん
17/05/21 06:36:57.09 YZtqITyu.net
型指定で行けたわ。
>>504thanks!!
import System.Environment
import Text.Printf
-- 数値型を文字列型に変換して文字列の頭に追加
consNum::(Int,String) -> String
consNum (x,s) = printf "%4d:%s" x s
-- 文章の行ごとに番号を振る
numbering = unlines.(map consNum).(zip [1..]).lines
-- ファイル名と内容(行番号付き)のタプルを作る
zipFile_Content f = (zip f).map numbering
-- ファイル名とファイルの内容を表示
putFile_Content (f,c) = printf "%s\n%s" f c
main = do
args <- getArgs -- コマンドから与えられたファイルのリストを受け取る
cs <- mapM readFile args -- 全てのファイルの内容を読み込む
mapM_ putFile_Content $ zipFile_Content args cs -- 全てのファイルのファイル名と内容(行番号付き)を表示

517:デフォルトの名無しさん
17/05/21 06:53:36.19 YZtqITyu.net
この長さならputFile_Contentをラムダ式に戻しても良いな。

518:デフォルトの名無しさん
17/05/21 07:21:47.89 NQzGLOFd.net
>>506
可変長引数の仕組みはこんな感じ
class Count r where count :: Int -> r
instance Count Int where count n = n
instance (Count r) => Count (a -> r) where count n = const (count (n+1))
countArgs = count 0
main = print $ (countArgs 1 True "a" :: Int)

519:デフォルトの名無しさん
17/05/22 19:08:38.92 5O5zI7xX.net
>>511
これcountArgは型推論で型解決されてるの?

520:デフォルトの名無しさん
17/05/22 22:52:47.32 8pBxEsLa.net
1 2 3みたいなコードのエラーメッセージを見るに
関数適用で引数分の関数だと推論されるんだろうね

521:デフォルトの名無しさん
17/05/23 10:24:38.23 3W0XlzKr.net
Haskell - GHC for iOS : iOSアプリをHaskellで開発する
URLリンク(blog.euphonictech.com)
GUIはObjective-Cに任せて中身はHaskell。
テーブルゲーム系は作りやすい言語だから、案外向いてるかも。。。

522:デフォルトの名無しさん
17/05/23 14:48:19.87 f1Q/bDWm.net
Androidは?

523:デフォルトの名無しさん
17/05/23 17:25:53.49 PJIONmxy.net
haskell androidでググったらトップで出るお。
Ubuntuなら最初の辺りは省けそう。
cabalじゃなくてstack入れた上でcabalへのパス通す方向で行った方が失敗少なそう。

524:デフォルトの名無しさん
17/05/23 19:23:10.81 jde/WziY.net
ghc ios弄ってるよ。
7.8のghcは32bits版はghc公式のサイトにある。64bits のghc iosバイナリは公開されてない。
Appleのお達しにより64bitsを同梱しなければApp Storeにリリース出来ない。
HEADは試してないけど、3/27のソースではビルドは通った(ちなみにそのソースでは32bitsは素直に通らない)。
64bits のghc iosは現在活発にメンテされているようです。
俺は今は make binary-dist (つまり、ghc-....tar.xzを作るやつ)と、stackを直しています。
stackはcross compiler対応してないので、改造が必要なんだ。stack setup --os ios で一発インストールできるとこまで持っていきたい。
> cabalじゃなくてstack入れた上でcabalへのパス通す方向で行った方が失敗少なそう。
そのワークアラウンドは思いつかなかった。詳しくおしえてくれませんか。

525:デフォルトの名無しさん
17/05/23 19:32:03.75 5hEoQuZK.net
え、cabalって書いてるところをstackに置き換えるけど、パス通す時cabalへのパスって言う、非常に単純で頭の悪いやり方だが。。。
単純にcabalが依存関係で止まる確率下がらないかなぁと。

526:デフォルトの名無しさん
17/05/23 22:54:19.25 jde/WziY.net
>>518
なるほど。俺が勘違いしているのでなければ、
URLリンク(ipx.hatenablog.com)
のページのajhcをcabal install するときの話ですね。
うちの環境はMacなのでためせないのだけど、hackageにあるajhcのcabalファイルをみると依存パッケージのバージョン指定がほぼ無いので、ひょっとするとビルド通るかも。
少なくともstackの方がcabalよりは可能性高そうですね。
スマホ開発について、俺はajhcを使うアプローチは試してないのですが、他にもGHCjsを使ってjavascriptに落とした後、
PhoneGapとかで埋め込む、って手もありそうです。

527:デフォルトの名無しさん
17/05/24 00:32:17.87 NrN6swuV.net
GHCjsなんてあったんだ。。。
fayってのはどこかのブログで見かけたけど。

528:デフォルトの名無しさん
17/05/24 21:57:13.55 NmDuToTQ.net
数値が書かれた文字列の大きさを比べたりソートするときってIntに変換しなくても大丈夫?

529:デフォルトの名無しさん
17/05/24 22:29:07.75 yk/rwiNc.net
いける
URLリンク(hackage.haskell.org)
URLリンク(hackage.haskell.org)
とか読んでみたら

530:デフォルトの名無しさん
17/05/24 22:31:16.66 yk/rwiNc.net
ただし後者は…読めない

531:デフォルトの名無しさん
17/05/24 22:54:24.29 YpWp2KMv.net
a="1000"とb="999"を比べるとして、
頭から3桁目までを比べるとbのほうが大きい
けどaにはまだ続きがあってbには続きがない、だからaが大きい
こんなアルゴリズムだったような

532:デフォルトの名無しさん
17/05/25 00:11:42.62 izfj8ylF.net
>>521
辞書式順序になる。
“1000” < “200” < “30” < “4”
みたいに。

533:デフォルトの名無しさん
17/05/25 00:33:59.08 Q9+DetqO.net
>>521
変換しないと悪魔でも文字列としてソートするよ?
["10","100","20"]

534:デフォルトの名無しさん
17/05/25 00:46:54.13 ZBW/Sl3S.net
みんなありがとう
read :: String -> Intって書くのがめんどくさくて楽したかっただけなんだ
めんどくさがらずにちゃんとやるよ

535:デフォルトの名無しさん
17/05/25 01:31:24.27 fGPRo4Tg.net
naturalcompを入れた場合、
Prelude> :m +Data.List Text.NaturalComp
Prelude Data.List Text.NaturalComp> naturalComp "1000" "999"
GT
Prelude Data.List Text.NaturalComp> sortBy naturalComp ["1","99","1000","10","999","9"]
["1","9","10","99","999","1000"]
だいたい思ったとおりになると思うが

536:デフォルトの名無しさん
17/05/25 09:09:45.17 ob559wKW.net
>>527
ごめん。
>>522に出てたの知らなかった。
>>522のライブラリ使えば問題無いみたい。

537:デフォルトの名無しさん
17/05/25 11:03:59.19 izfj8ylF.net
>>529
こんな簡単なことで外部ライブラリに依存とかしたくないでしょ

538:デフォルトの名無しさん
17/05/25 11:22:28.03 jD8c7u6v.net
まあねぇ。
んじゃあ桁ごとにグループ分けして、それぞれをソートして、その後結合?

539:デフォルトの名無しさん
17/05/25 11:41:35.46 XfbQ4lvY.net
>>530
俺は大いに依存(利用)して問題ないと思う。
勉強も兼ねてるなら自作を勧めるが。

540:デフォルトの名無しさん
17/05/25 13:06:15.57 jD8c7u6v.net
昔のHaskellの(1+n)形式の引数復活しないかな。。。
代数的データ型で自然数作ったりの時、普通の関数だとこう。みたいな整合性が取れないのがね。。。
type Nat = Succ(Nat) | Zero
dec (succ(n)) = n
dec(Succ(Zero))
>Zero
dec (1 + n) = n
dec 1
>0

541:デフォルトの名無しさん
17/05/25 14:02:18.77 XfbQ4lvY.net
>>533
どんな時に代数的データ型で自然数を作るの?

542:デフォルトの名無しさん
17/05/25 18:02:15.54 KkJBSxnE.net
お遊びの時。
だから無くても困らないけど、昔あったの知ってると復活しないかな。。。と。

543:デフォルトの名無しさん
17/05/26 00:23:29.72 lBtW1IaY.net
{-# LANGUAGE NPlusKPatterns #-}

544:デフォルトの名無しさん
17/05/26 02:18:52.31 NvS9muX6.net
何!!
復活の呪文あるんか!!

545:デフォルトの名無しさん
17/05/26 03:26:42.35 NvS9muX6.net
dec (n + 1) = n
は通るけど
dec (1 + n) = n
は通らない。。。
なんかモヤモヤ。。。

546:デフォルトの名無しさん
17/05/26 06:58:01.57 57q7qnDF.net
Haskellerこっわ
URLリンク(twitter.com)

547:デフォルトの名無しさん
17/05/26 07:45:17.70 npmNm3qp.net
NPlusK ゆうとるやろが

548:デフォルトの名無しさん
17/05/26 08:02:14.29 BGbWYOFh.net
だからKPlusNを追加したら、ンなもんねーよって怒られた。。。
あるだけ有難いけどね。

549:デフォルトの名無しさん
17/05/26 08:07:54.48 BGbWYOFh.net
>>539
Haskell使いって入ってるだけで、コードも何も語ってないやん。
はてなのHaskellerは優秀で良い人ばかりだお。
おいらは優秀じゃないし、プログラミング自体からほとんど引退してるからやめたけど。

550:デフォルトの名無しさん
17/05/26 08:24:06.27 KgVkYaTe.net
突然の自分語り

551:デフォルトの名無しさん
17/05/26 09:52:10.14 x3L8qn59.net
Haskellのプログラミングで金をもらう
Haskellerなる人物に何人も合ったが、
精神科通いとかの頭のオカシイやつばっかだった。
たまたまなのかも知れんが。

552:デフォルトの名無しさん
17/05/26 10:07:05.22 lBtW1IaY.net
両方名うてのキチガイやないかw

553:デフォルトの名無しさん
17/05/26 10:08:41.81 lBtW1IaY.net
ちなみにHaskellerがおかしいというよりは
CS業界が全般に発達障害とキチガイに寛容なだけ

554:デフォルトの名無しさん
17/05/26 10:25:10.56 NDbIiRhl.net
東大京大

555:デフォルトの名無しさん
17/05/26 10:47:10.88 NDbIiRhl.net
>>539
片方はGHCの機能追加してるガチ勢だぞ
単純な言語拡張も知らない分際でコード語ってないとかのたまってるやつ恥ずかしすぎる

556:デフォルトの名無しさん
17/05/26 11:08:43.28 7I4ytZjC.net
fumieval知らないとかモグリにもほどがある
自称関数型コミュニティでは超有名人

557:デフォルトの名無しさん
17/05/26 11:51:40.04 lBtW1IaY.net
>>548
>片方はGHCの機能追加してるガチ勢だぞ
そうだっけ?
なんかしょうもない型クラスのインスタンス追加して喜んでた記憶しかないわ

558:デフォルトの名無しさん
17/05/26 12:25:49.52 npmNm3qp.net
なにかHaskellにはそういう魔力めいた魅力でもあるのでしょうか

559:デフォルトの名無しさん
17/05/26 14:22:36.33 ck4pDWmC.net
関数脳になるとHaskellが癖になるのは確か。
オブジェクト指向のメソッドチェーンも入力->出力の連鎖で、関数型と同じなんだけど、ループや分岐も再帰やパターンマッチで書くから、より入力->出力に専念出来る。
思考がシンプルになる。
オブジェクト指向も思考をシンプルにする事を目指してるけど、クラス作る側とクラス使う側で大きな溝が出来てしまった。

560:デフォルトの名無しさん
17/05/26 16:33:50.74 kKmQOK+/.net
良くも悪くも変人しかHaskellなんて覚えようと思わないからじゃないかな
明らかに文法が異質だもの
多分みんな人生で何度か「変わってるね」って言われたことあるはず

561:デフォルトの名無しさん
17/05/26 17:33:52.44 ZKqulABJ.net
変わってると言えば否定しないけど、どの言語にもおいらみたいなのは一部居るんじゃないかな。
強いて言えばPythonやRubyにさえも挫折したおいらがHaskellで色々書けるようになって、書けるようになってからはPythonやRubyでも書けるようになって、Cでも書けるようにもなった。
例えばRubyのeach_slice相当の関数はHaskellに存在しない。
(Hoogleで調べても無かった)
でも、動きを理解さえすればすぐに同じ動きの関数が書けた。
PythonやRubyは基本が手続き型言語だから、ライブラリを知らないとか、ライブラリに存在しない時に急に難しくなる。
おいらみたいに、LLでさえ手続き型言語で挫折した人がHaskellで出来るようになって、はしゃいでるとかは有るかもね。

562:デフォルトの名無しさん
17/05/26 17:41:46.50 57q7qnDF.net
例の包丁Haskellerもそうだが、使っている奴は厨二病患者が多い
本当に厨二心をくすぐる言語なんだよ…
OCamlメインの俺としては変なのがこっちに吸われていて助かる

563:デフォルトの名無しさん
17/05/26 18:45:55.29 ZQcANW7U.net
変数も引数なしの値を返す関数。
a = 1
モナドもセクションにすればただの関数。
import System.Environment
slice n xs | length xs < n || n <= 0 = []
slice n xs = ys:slice n zs
where
(ys,zs) = splitAt n xs
main = (>>=) getArgs (print.slice 2)
そういう意味で、mainすらも引数なしでプログラムの結果を返す関数。
全てが関数と型と値だけで考えられる。
厨二で上等。
一貫した考えが素晴らしいね。
煩わしさがない。

564:デフォルトの名無しさん
17/05/26 18:49:06.98 sZfcErOL.net
なぜ自分は変じゃないと思えるのか……

565:デフォルトの名無しさん
17/05/26 18:49:10.19 ulIxfp/C.net
OCamlはラクダだもんな。厨二病もクソもないw
OcamlとかClojureはコードが丸い印象。Haskellは何か尖ってるよね。

566:デフォルトの名無しさん
17/05/26 18:50:59.74 40xXL869.net
コメントが (* *) だからさ

567:デフォルトの名無しさん
17/05/26 19:01:21.32 ZQcANW7U.net
>>557
え、否定しないって言ってるじゃん。
認めてるじゃん。

568:デフォルトの名無しさん
17/05/26 19:40:17.16 xBragGUI.net
>>556
セクションは部分適用した二項演算子のことだぞ

569:デフォルトの名無しさん
17/05/26 20:51:35.80 ovKX6RUR.net
あれ、どっちもセクションじゃ無かったっけ?と久しぶりに調べたら。。。
前置き形式?で良いのかな?
これは済まんかった。

570:デフォルトの名無しさん
17/05/26 21:07:05.78 lBtW1IaY.net
>>553
>良くも悪くも変人しかHaskellなんて覚えようと思わないからじゃないかな
>明らかに文法が異質だもの
ML系のワリと平凡な文法なんだけどね

571:デフォルトの名無しさん
17/05/26 21:28:16.56 TC/C61F7.net
変な文法と言えばPrologとかJ言語とか

572:デフォルトの名無しさん
17/05/26 21:36:15.75 ovKX6RUR.net
>>558
OCamlもHaskellも同じML系なのにどうしてそう感じたんだろう?
おいらみたいな使ってるやつの印象ってだけだったり?
おいらみたいなのは少数派だよ。
声が大きいから、たくさん居るように感じるだけ。

573:デフォルトの名無しさん
17/05/26 21:41:20.55 0YCuYapQ.net
すみません、質問です
f :: a -> b と g :: a -> c があったときに
\x -> (f x, g x) に相当する関数はライブラリに用意されてますか?

574:デフォルトの名無しさん
17/05/26 22:01:30.73 ovKX6RUR.net
>>564
Jは聞いた事はあっても触った事すらないので何とも言えないが、Prologは昔の関数型言語の本では次世代言語として紹介されてたな。
実際触って見て可能性自体は感じるんだが、引数が大文字始まりじゃないとダメとか、計算式が=じゃなくてisとかが、とにかく愛せなかった。。。
Prolog得意の家系図関数も、Prologなら自動で関係を見つけるのをHaskellだと家系図をモデルとした仕様書いて、関係性のルール見抜いて仕様にして、そのまま家系図をデータ型に、関係性のルールを関数にする。
関数はルールの条件を箇条書きすればそのままパターンマッチの関数になる。
この辺が手続き型言語に対するアドバンテージであり、Prologに対して見劣りする所。
でも関係性のルールを見抜く作業と、関数作る作業が私にとっては楽しいのでそれで良い。

575:デフォルトの名無しさん
17/05/26 22:03:34.66 EgTlEiWL.net
>>566
Control.Arrow の (&&&) だ。

576:デフォルトの名無しさん
17/05/26 22:07:24.39 ovKX6RUR.net
>>566
型でHoogle検索して見ては?
探すより作った方が早そうだが。
dfunc f g x = (f x, g x)

577:デフォルトの名無しさん
17/05/26 22:16:23.90 0YCuYapQ.net
>>569
(a -> b) -> (a -> c) -> a -> (b, c) とかで検索しても出なかったんですが
検索の仕方が悪かったのかな
>>568
そんな関数があったんですね、勉強になりました
ありがとうございます

578:デフォルトの名無しさん
17/05/26 22:34:36.00 ovKX6RUR.net
>>568
演算子としての使い方分からなくてググったわw
ほへー。。。
Arrowって基本こう使うのね。
こりゃHaskell分かりにくいってなる訳だよ。

579:デフォルトの名無しさん
17/05/26 23:18:50.05 npmNm3qp.net
型シグネチャから利用法読み解くのはIQモンスターでないと無理
設計者の思想を語ってもらわないと

580:デフォルトの名無しさん
17/05/26 23:54:53.85 nlWdhydN.net
結局>>566は解決したんかな。。。
用途に合わせて自作した方が早いし読みやすいと思うんだが。
格好いいからって過剰にArrow使ったりってのもなぁ。
もうそっちのが慣れてて早いんなら別だが。

581:デフォルトの名無しさん
17/05/27 00:13:32.94 ChWjXNtT.net
データフローを記述するようなコードならArrow使えばいい

582:デフォルトの名無しさん
17/05/27 00:28:51.27 Cj0QDtYS.net
そうね。
逆にxと関数のリスト二つ受け取って、(f x, g x)のリストを得るとかだと引数の順番好きに選べる普通の関数のが良いと思う。
dfunc x f g = (f x, g f)
なりそう言うラムダ式をmapのリスト二つ版(仮にmap2)を作って渡せば良い。
結局>>566が何をしたかったかによる。

583:デフォルトの名無しさん
17/05/27 01:16:44.64 BlrnYoHB.net
Control.ApplicativeのliftA2を使って
liftA2 (,) f g
でもいけるよ。

584:デフォルトの名無しさん
17/05/27 07:13:42.02 BlrnYoHB.net
昨日の事件について、意見を書いた
URLリンク(anond.hatelabo.jp)

585:デフォルトの名無しさん
17/05/27 08:54:38.45 pQ5DUsdI.net
>>539
頭悪い会話すぎて笑った

586:デフォルトの名無しさん
17/05/27 08:59:16.85 ChWjXNtT.net
>>576
>liftA2 (,) f g
あー、関数アプリカティブか。

587:デフォルトの名無しさん
17/05/27 10:15:02.70 y8N3m0Nz.net
>>572
型だろうが思想だろうが同じこと
コードを1行も書かなくても分かり合えるのはIQモンスターだけ

588:デフォルトの名無しさん
17/05/27 10:32:14.53 C4ObyqB4.net
おまいらが楽する分Haskellコンパイラの
作成が激ムズになる件。

589:デフォルトの名無しさん
17/05/27 10:59:01.67 y8N3m0Nz.net
>>573
格好いいからじゃなくて
Monadはカリー化を過剰に使ってるからタプルを使わない
だからタプルに関係のあるものはArrowの方に集まってくる

590:デフォルトの名無しさん
17/05/27 12:15:10.10 yeXCnzln.net
>>582
そういう理由で使われてたのか
理論的にArrowベースのことやってるのかと思ってた

591:デフォルトの名無しさん
17/05/27 12:23:21.54 Vkpp8Cst.net
>>533
succの逆はpredな
デクリメントではない

592:デフォルトの名無しさん
17/05/27 13:39:14.00 zKKPdOe3.net
****sucking の逆教えてや

593:デフォルトの名無しさん
17/05/27 16:44:16.35 ectnCudZ.net
>>585
****vomit

594:デフォルトの名無しさん
17/05/28 01:36:41.46 i0C/srSl.net
ちょっ違うなVomit****だ

595:デフォルトの名無しさん
17/05/28 09:27:04.54 s8SCebgh.net
-rw------- 1 root root 13796 5月 25 23:39 /usr/share/man/man1/cabal.1.gz
ArchLinuxでcabalのmanが読めないのはなんかのいぢめですか?

596:デフォルトの名無しさん
17/05/28 13:11:13.15 wvAEkP6f.net
リストのn番目の要素をaからbに変えたリストを返す関数とかないですかね?
splitAtで分けてから加工してまた繋げればいいのかな

597:デフォルトの名無しさん
17/05/28 13:22:58.81 Ga0OokE+.net
>>589
ilist というライブラリに Data.List.Index.setAt :: Int -> a -> [a] -> [a] という
質問そのものの関数があるよ。

598:デフォルトの名無しさん
17/05/28 20:35:00.08 Rx3nBVE8.net
一目、効率悪そう

599:デフォルトの名無しさん
17/05/28 22:10:57.08 3aZpEfHH.net
元のリストを破壊することなく新しいリストを作るからね
不特定多数から参照されるデータは破壊できないから効率が悪い
所有権がないと参照できないような仕組みがあれば良いのか

600:デフォルトの名無しさん
17/05/28 22:31:00.36 A2iCvXLz.net
>>589
nとaと(x:xs)受け取ってnが0になったらxの代わりにaをcons(:)すればいい。
setAt _ _ [] = []
setAt 0 a (_:xs) = a:xs
setAt n a (x;cs) = x:setAt (n - 1) a xs

601:デフォルトの名無しさん
17/05/28 23:05:39.10 Ga0OokE+.net
>>593
それ、質問者の言う splitAt で分けてからっていう方法と同じ

602:デフォルトの名無しさん
17/05/28 23:14:43.47 wvAEkP6f.net
>>590
>>593
ありがとうございます
Data.IndexのsetAt関数の定義をそのまま使わせてもらおうと思います

603:デフォルトの名無しさん
17/05/28 23:23:12.14 Rx3nBVE8.net
リストのコピーって、(既にある)リストの各要素の格納先と同じアドレスを指すポインタを新規アロケートしてく感じですか?
それとも一々要素までをもコピーするんですか?

604:デフォルトの名無しさん
17/05/29 00:33:15.43 21264BYs.net
コピーしてたらリストの意味無いからアドレスを新しく指してるんだと思う。
でないと、ソートとかメモリ幾らあっても足りなくなる。

605:デフォルトの名無しさん
17/05/29 00:49:02.28 21264BYs.net
>>594
SplitAtで分けると前方がリストになる。
(++)と(:)じゃ(:)のが効率が良い。
(++)は前方のリストが長くなると著しく遅くなる性質がある。

606:デフォルトの名無しさん
17/05/29 01:12:03.29 21264BYs.net
>>594
ちなみにsplitAtのやり方だとtake n zsの一番最後が更新したい場所になるので、initした上で++[a]++ysする必要がある。

setAt n a zs = init xs ++ [a] ++ ys
.........................where (xs, ys) = splitAt zs

Haskellでswap関数を作る7つの方法とか言うページ思い出したわ。。。

607:デフォルトの名無しさん
17/05/29 01:13:40.94 21264BYs.net
x splitAt zs
o splitAt n zs

608:デフォルトの名無しさん
17/05/29 06:42:46.07 0mYha2aU.net
(++) (x:xs) ys = x : (++) xs ys
setAt n a (x:xs) = x : setAt (n-1) a xs
これを比較して前者が著しく遅いというのは嘘八百だな

609:デフォルトの名無しさん
17/05/29 06:59:53.71 Ny51uA9N.net
>>601
reverse関数をfoldl (\x -> x:ls) [] xsで書くのとreverse xs ++ [x]で作るのじゃ反転した文字列が生成される度に右から結合されて凄く遅い。
上の>>599も、init xs ++ [a]で一旦結合して、++ ysの部分に来たらまたinit xs部分から結合が始まる。

610:デフォルトの名無しさん
17/05/29 07:04:59.77 Ny51uA9N.net
あ、逆か。
ysから始まってリストの先頭まで結合する。
出力する際には結局先頭から(:)伝いに辿って行くのでそう言う二度手間は避けた方がいい。

611:デフォルトの名無しさん
17/05/29 07:20:56.98 Ny51uA9N.net
ここで言う問題は、++ysそのものに害は無いけど、init xs ++ [a]で一旦先頭まで結合する処理が挟まってるってことね。

612:デフォルトの名無しさん
17/05/29 07:35:03.41 0mYha2aU.net
実は++も右結合なんだよな
だから init xs ++ [a] ++ ys を (init xs ++ [a]) ++ ys と解釈するのは絶対ダメ

613:デフォルトの名無しさん
17/05/29 07:35:56.11 Dokhp7Id.net
setAt i x xs = let (ys,_:zs) = splitAt (i-1) xs in ys ++ x : xs
別にこういう定義にすればいい
でこれが遅いのは単にysの部分が2パスになるから

614:デフォルトの名無しさん
17/05/29 07:39:00.53 Dokhp7Id.net
>>606
ミス
x : xsじゃなくてx : zs

615:デフォルトの名無しさん
17/05/29 07:52:38.57 KKAtyjp+.net
別にそれでも良い。
(++)は取り扱い次第で遅くなるってだけ。

616:デフォルトの名無しさん
17/05/29 15:03:33.95 2+2L65e+.net
というわけで、Sequenceです

617:デフォルトの名無しさん
17/05/29 20:13:36.52 0mYha2aU.net
showで文字列を作るのは平気なのにリストを作ると遅い遅いと言われる現象
数学的というより人間工学っぽい

618:デフォルトの名無しさん
17/05/29 20:46:32.77 VknhjnwZ.net
出現頻度の問題では?

619:デフォルトの名無しさん
17/05/29 21:27:07.82 0mYha2aU.net
リストを使う頻度はIOを使う頻度と関係ありそう
IOを使う頻度は個人差が非常に大きい

620:デフォルトの名無しさん
17/05/29 21:54:24.18 2+2L65e+.net
初心者はモナド変換で躓く

621:デフォルトの名無しさん
17/05/30 04:05:18.67 jc1LxPHe.net
例外処理のベストプラクティスがよく分からないなー
catchとかhandleでメイン処理、例外処理共に複数行になる時に、命令型のtry~catchみたいに無名関数での書き方ってどうなるんだろう
関数に切り出して呼ぶべし、なんかな?
どっちかだけ複数行ならそっちをdoにしたら良いっていうのは分るんだけど

622:デフォルトの名無しさん
17/05/30 05:14:25.23 jc1LxPHe.net
パーレンで囲んだラムダは複数行いけるのな、見た目微妙だけど

623:デフォルトの名無しさん
17/05/31 03:43:11.48 ML3xxqnu.net
パーレン ()
ブラケット []
ブレース {}

624:デフォルトの名無しさん
17/06/03 16:54:41.37 c6fwatRb.net
f g n = gをn回合成した関数
みたいな関数のが欲しい

625:デフォルトの名無しさん
17/06/03 17:14:18.00 PKJ3i7am.net
f = (!! n) . (iterate g)

626:デフォルトの名無しさん
17/06/03 18:46:29.60 RovdiJA/.net
>>618
それって真面目なコードで使っていいのか?
融合変換で実質ループなのは知ってるけど
そもそもこのレベルを勝手に抽象化していいものかどうか

627:デフォルトの名無しさん
17/06/03 20:14:20.72 lhcAcbkl.net
なんの問題もないと思うけど

そもそも同じ関数の反復適用が iterate なんだから
たいして抽象的でもない

628:デフォルトの名無しさん
17/06/03 20:24:38.74 lhcAcbkl.net
iterative f n = foldl1 (.) $ take n $ repeat f


これより >>618 の方がわかりやすいと思う

629:デフォルトの名無しさん
17/06/03 20:28:35.64 lhcAcbkl.net
iterative f n = foldl' (.) id . map (const f) $ [1..n]

とかでもいいか。そして iterate の方があきらかにわかりやすい。

630:デフォルトの名無しさん
17/06/04 00:13:00.20 zJIyEnOK.net
Cabalプロジェクトをstackでビルドできないだろうか?
cabalをグローバルにインストールしたくないんだ

631:デフォルトの名無しさん
17/06/07 04:45:18.83 WOFnqCYP.net
haskellで○×ゲーム作りました(頑張った私を褒めてください)
URLリンク(ideone.com)

632:デフォルトの名無しさん
17/06/07 08:42:17.54 gpLNw8mo.net
勝利判定なんとかならんのかw

633:デフォルトの名無しさん
17/06/07 10:28:15.63 ZiMqMUeJ.net
ゲームとかアルゴリズムとかどうでもよくて、ここが可愛いってのがポイントだろ?
('o':'o':'o': _ : _ : _ : _ : _ : _ :_) -> True
( _ : _ :'x': _ :'x': _ :'x': _ : _ :_) -> True

634:デフォルトの名無しさん
17/06/07 17:37:30.82 goEom//K.net
下は泣いてるミッフィーちゃんがクローン技術で失敗したような感じ

635:デフォルトの名無しさん
17/06/07 22:12:38.86 FEgyIbtW.net
昔オセロ作ったけど、勝敗判定作るの忘れて延々パスし続けたわ
main =
    void $ loop (player >=> ai) initBoard
        where loop :: (Board -> IO Board) -> Board -> IO Board
              loop f ib = loop f =<< f ib

636:デフォルトの名無しさん
17/06/08 02:06:09.79 3NnY77Pk.net
>>624
同じゲームでも人によって設計や実装が全然違ってて面白いな
○×ゲーム - a-sanの日記 - haskell
URLリンク(haskell.g.hatena.ne.jp)
yasuabe blog: Haskell で三目並べ (2)
URLリンク(yasutech.blogspot.jp)
examples/TicTacToe.hs
URLリンク(projects.haskell.org)
TicTacToe - HaskellWiki
URLリンク(wiki.haskell.org)
Tic-tac-toe in Haskell ・ GitHub
URLリンク(gist.github.com)

637:デフォルトの名無しさん
17/06/11 01:46:27.90 vYdG9fRO.net
開発環境としてleksahを入れてみたんですが、getLineのような標準入力が上手く動いてない気がします
実行しても入力出来るようにならず止まってしまうのですが、どうしたら入力出来るようになりますか?

638:
17/06/11 05:15:07.62 afWo9qoQ.net
今気づいた! leksah ってHaskell逆読みじゃん!

639:デフォルトの名無しさん
17/06/11 12:39:02.23 hZZQfw5d.net
月並な命名をされた月並なアプリ

640:デフォルトの名無しさん
17/06/11 16:52:05.15 3HVnXb8h.net
>>68
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
> となるような関数fはどのように書けるでしょうか
めちゃ遅レスでなんだけど、f [x, y] = x : [y] ではだめなの?

641:デフォルトの名無しさん
17/06/11 17:45:34.43 uxrAPwUF.net
>>633
自分でちゃんとテストしてみた?

642:デフォルトの名無しさん
17/06/11 22:56:26.81 3HVnXb8h.net
>>634
リストの定義から明らかだと思うのでテストはしていない

643:デフォルトの名無しさん
17/06/11 23:16:23.58 0ffmynih.net
>>635
リストの定義から明らかだが、>>69

644:デフォルトの名無しさん
17/06/11 23:46:34.97 QTMXbNo3.net
驚き最小=テスト最小の法則

645:デフォルトの名無しさん
17/06/11 23:54:46.06 3HVnXb8h.net
>>636
何と何の型がどう合わない?

646:デフォルトの名無しさん
17/06/12 00:18:12.16 9+UoMkQw.net
テンプレート?

647:デフォルトの名無しさん
17/06/12 01:00:35.16 p/7lEol5.net
fを適用した結果の型が外側のリストの型と合わないってことでら

648:デフォルトの名無しさん
17/06/12 01:38:16.98 0O7XnA5J.net
たぶんshowの結果を評価する途中でunsafePerformIOすればいいんだな

649:デフォルトの名無しさん
17/06/12 01:46:50.84 4tiz7p+p.net
[ “aa”, “bb”, [“cc”,”dd”] ]
の型がどうやって合うと思ったのだろうか。

650:デフォルトの名無しさん
17/06/12 02:20:04.97 DHBWzfrJ.net
邪悪なことはするな

651:デフォルトの名無しさん
17/06/12 02:47:23.94 q+c9m0UT.net
>>638
文字列型の中に文字列のリスト受け取って文字列を返す関数型が混じってる。

652:デフォルトの名無しさん
17/06/12 09:44:54.21 4tNZZp5I.net
>>644
それは違う。関数型が混じってるんじゃない。
>>642
["a", "b", ["c", "d"]]
= "a" : ("b" : ["c", "d"])
= "a" : ("b" : ("c" : "d"))
= ["a", "b", "c", "d"]
じゃないの?

653:デフォルトの名無しさん
17/06/12 09:53:23.55 4tNZZp5I.net
>>642
自己解決しますたw nilをきちんと入れてなかったみたい。

654:デフォルトの名無しさん
17/06/12 17:07:14.08 uTHinYqc.net
>>645
関数自体も値なのだが。。。
仮に返り値だとしても、文字列のリストにさらに文字列のリストが入ってるので型が合わない。
["a","b",["c","d"]]
="a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。

655:デフォルトの名無しさん
17/06/12 17:22:26.96 pxvA8Fxv.net
なんでここでnilの話になるんですか?

656:デフォルトの名無しさん
17/06/12 18:54:07.23 rXVGv3m5.net
どうしてもできないときは、それはする価値がないのだ
= 何かをしたくて、その手段としてそれをしようとしているが、実は何かはそれでなく別の方法でより自然に実現できることが多い。無理矢理その手段を開発する価値が本当にあるのか、もう一度考えてみよう

657:デフォルトの名無しさん
17/06/12 20:01:13.71 4tiz7p+p.net
GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに
• Couldn't match expected type ‘Char’ with actual type ‘[Char]’
• In the expression: "cc"
In the expression: ["cc", "dd"]
In the expression: ["aa", "bb", ["cc", "dd"]]

658:デフォルトの名無しさん
17/06/12 21:30:08.56 4tNZZp5I.net
>>647
> ["a","b",["c","d"]]
> = "a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。
文字列または文字列のリストからなるリストというのはあり得るでしょう?
その場合ならエラーではないはず
>>649
> どうしてもできないときは、それはする価値がないのだ
いまの場合、どうしてもできない証明はどうするんだろう?
>>650
> GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに
それだけではその評価が本当に正しいかどうかが分からない

659:デフォルトの名無しさん
17/06/12 22:36:06.43 ejDn/VSN.net
>>651
> 文字列または文字列のリストからなるリストというのはあり得るでしょう?
文字列というのが String 型を指していて、文字列のリストというのが [String] 型を指しているのであれば、
文字列または文字列のリストからなるリストという型は「あり得ません」。
なぜなら、Haskell には「型A または 型B」という型は存在しないからです。
(data T = D String | E [String] の型は T であって、D や E ではない)

> いまの場合、どうしてもできない証明はどうするんだろう?
なぜ「証明」を求めるのでしょうか。
Haskell だとこれはできないよと言われ、簡単な理由を説明された時、
あなたはいつもその証明を求めるのですか。
今回の問題に限って求めているのであれば、その理由を説明してください。
理由によっては、あなたが納得できる証明以外の説明ができるかもしれません。
というのも、できないことの証明を本当にしようとすると、かなり難しいからです。
きっと構文規則や意味論にまで話が及びます。
そんな証明できる人は稀ですし、できる能力があっても、したくないでしょう。

> それだけではその評価が本当に正しいかどうかが分からない
あなたの場合、「正しい」とは何を意味するのでしょうか。
>>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、
ということだと思いますよ。
それが正しいのか分からないというのは、GHC は信用できないということですか。

660:デフォルトの名無しさん
17/06/12 22:39:18.30 4tiz7p+p.net
>>651
URLリンク(paiza.io)
こういうのがお望み?
いずれにせよ List のデータコンストラクタ(:)を持ち出した >>633 は救済できんが。

661:デフォルトの名無しさん
17/06/12 22:48:23.36 cqbaGfvU.net
もしかして本当に欲しかったもの:
[["aa"], ["bb"], ["cc", "dd"]]

662:デフォルトの名無しさん
17/06/12 22:49:39.74 4tiz7p+p.net
URLリンク(paiza.io)
こっちのほうがパラメータ多相でいいか。

663:デフォルトの名無しさん
17/06/12 22:58:41.14 4tiz7p+p.net
ちなみに、自分自身を要素の型とするかのような「ネストしたリスト」のようなデータ構造(というかinfnite typeのまがいもの)自体はときどき使いたくなるので簡単なライブラリを書いたことはある。そういやOCamlは オプショナルだが infnite type 扱えるんだったっけ??

664:デフォルトの名無しさん
17/06/12 23:23:51.05 4tNZZp5I.net
>>652
> なぜなら、Haskell には「型A または 型B」という型は存在しないからです。
「今のHaskell」には存在しないということね?
こっちは今のではなく本来のに興味があるので。
> Haskell だとこれはできないよと言われ、簡単な理由を説明された時、
> あなたはいつもその証明を求めるのですか。
簡単な理由でよいのだが、「今そうなってるから」は興味がない
> あなたの場合、「正しい」とは何を意味するのでしょうか。
> >>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、
> ということだと思いますよ。
さっきも言ったが、「今そうなってる」というのは 「正しい」とは異なる

665:デフォルトの名無しさん
17/06/12 23:32:25.99 .net
方法が存在しないことの証明って悪魔の証明でないの?
できると主張する側ができることを証明しないとダメだよ
痴漢の言いがかりをつけられて、『痴漢していないことを証明しない限り有罪な』って裁判官に言われて納得できる?

666:デフォルトの名無しさん
17/06/12 23:39:48.75 4tiz7p+p.net
>>657はできるという根拠をコードで示せばいい。
Haskell 2010 に従ったコードで、しかしGHCが不当にも
型検査で排除するというような、そういうコードを示せば
話はたちまちに解決する

667:デフォルトの名無しさん
17/06/12 23:42:32.96 4tiz7p+p.net
[“aa”, [“bb”,”cc”]]
について Haskell2010 の構文規則をを充足するような
Haskellの型をつけてくれればいい

668:デフォルトの名無しさん
17/06/12 23:43:46.21 ejDn/VSN.net
>>657
みんな、特に断りがなければ今のHaskellについて質問したり語ったりしています。
なので、そうでなければ、初めにちゃんと断っておかないと、話が合わなくなります。
また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。
私は今のところ、今のHaskellでアプリを作ることに興味が向いているので、
そうではない議論からは抜けさせてもらいます。

>>658
方法の存在を仮定した場合に矛盾がおきることを示すことで、方法の非存在を示すやり方もあります。
数学(厳密な論理)の舞台に上げられるテーマであれば友好的な手です。
(面倒かどうかは別にして)

669:デフォルトの名無しさん
17/06/12 23:48:33.05 ejDn/VSN.net
>>661
うぁ、恥ずかしい、友好的な手って何だよ。
有効な手、ね。

>>659
彼、今のHaskellには興味ないそうですよ。

670:デフォルトの名無しさん
17/06/12 23:48:35.55 PpCA4OTT.net
定義の証明をしろってことか
1の次の数は2であることを証明しろ的な
つまり1=2は間違いとは言えないのだ

671:デフォルトの名無しさん
17/06/12 23:59:06.10 4tiz7p+p.net
>>663
>1の次の数は2であることを証明しろ的な
>つまり1=2は間違いとは言えないのだ
Succ 1 = 2 とか普通にPAで証明できるけど……

672:デフォルトの名無しさん
17/06/13 00:09:20.22 kWBme6H8.net
本来のHaskellってなんですか

673:デフォルトの名無しさん
17/06/13 00:57:22.00 12SNvyK/.net
LISPベースのリスト

674:デフォルトの名無しさん
17/06/13 11:30:18.72 OES2L0YQ.net
>>651
それぞれのリストはあるけど、両方の型を持ったリストはない。
リストがいっぺんに受け取れる型は一つだけ。
ghciで拒否られたらそれまでじゃね?
何か作りたいわけじゃないって事?
下で将来のHaskellとか語ってるっぽいけど、今作れないでいつ作るの。
>>645見るに最終的に欲しいのは
["a","b","c","d"]
だろ?
f ["a","b"] ["c","d"]
= ["a","b"] ++ ["c","d"]
= ["a"] ++ "b":["c","d"]
= [] ++ "a":"b":["c","d"]
= ["a","b","c","d"]
じゃあダメなのか?
手段にこだわるより、目的果たす事考えようぜ。

675:デフォルトの名無しさん
17/06/13 12:23:55.30 JgnP6kSF.net
>>658
> 方法が存在しないことの証明って悪魔の証明でないの?
そんなことないよ。不可能性の証明なんて数学では普通にあるでしょ
>>661
> 特に断りがなければ今のHaskellについて質問したり語ったりしています。
スレタイは「今の」とはなっていない。「今の」「Haskell」に限るとつまらない
「関数型プログラミング言語」 の方がおもしろい。ここは「関数型プログラミング言語」がテーマと認識している。(俺はね)
「今の」「Haskell」は単にその一つ
> また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。
本来の関数型プログラミング言語程度の意味。それはみんな意識してるでしょ?
>>667
> それぞれのリストはあるけど、両方の型を持ったリストはない。
それは今のHaskellについた制限のようなものでしょ?
> f ["a","b"] ["c","d"]
> = ["a","b"] ++ ["c","d"]
> = ["a"] ++ "b":["c","d"]
> = [] ++ "a":"b":["c","d"]
> = ["a","b","c","d"]
>
> じゃあダメなのか?
それではもとの問題と違うし、スマンが興味わかんわ

676:デフォルトの名無しさん
17/06/13 13:10:39.07 s+JNd9SI.net
>>668
将来も今も["a","b","c","d"]は[String]って型で表現できるけど、
["a","b",f ["c","d"]]はどういう型で表現するのさ?
こう表現出来るってのが無いと、ただ単に型に対する意識が低いだけのお馬鹿さんだよ?

677:デフォルトの名無しさん
17/06/13 13:17:22.94 s+JNd9SI.net
大体、複数に型を纏めるんならタプル使えよ。
(["a","b"], f ["c","d"])
fが部分適用してない、値を返す関数なら結果の型が入るし、部分適用で関数としてタプルに入ってるなら何か受け取って何か返す関数の型がタプルにに入る。

678:デフォルトの名無しさん
17/06/13 14:08:02.45 pIEcxV3Y.net
nilわすれてるってのはさ、
[a, b, c, d] と a : b : c : d : [] が等価ってことでさ、
この末尾の:[]を忘れたらあかんってことじゃないの?

679:デフォルトの名無しさん
17/06/13 14:26:42.82 JgnP6kSF.net
>>669
そこのfはどういう関数型という想定?

680:デフォルトの名無しさん
17/06/13 15:33:15.95 kWBme6H8.net
自分の間違いを認められず引くに引けなくなってるだけなんじゃないの

681:デフォルトの名無しさん
17/06/13 18:11:35.28 XoC5HvTL.net
>>672
>>668に聞いてくれ。
そもそもどんな型でも文字列が返ってくる以外は入れられない。
f = concat
["a","b",f ["c","d"]]
=["a","b","cd"] --これは>>668のやりたいことでは無い。
こう言うの以外は現行で受付られないが、それ打破するリストの型表現が存在出来るなら、将来実装されるかもな。

682:デフォルトの名無しさん
17/06/13 18:19:50.97 pvAx0DQv.net
fは引数でもない外側のリストを無理やり拡張するのか……おぞましいな
そんな実装されたらHaskell見限るわ

683:デフォルトの名無しさん
17/06/13 18:35:46.29 XoC5HvTL.net
だよな。
だからこそmapとかの関数作りやすいのに、そんな変な機能将来に渡って欲しいとは思わん。
入力->出力が素直だからこその関数プログラミングだってのに。
欲しい最終データが手に入れば良いのに、>>668は手段と目的が逆転してんだよ。

684:デフォルトの名無しさん
17/06/13 19:30:15.82 .net
どうしてもそれができないときは、本当にそれが必要不可欠なのか、もう一度よく考えてみよう

685:デフォルトの名無しさん
17/06/13 21:22:18.24 JgnP6kSF.net
>>669
> ["a","b",f ["c","d"]]はどういう型で表現するのさ?
関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。
>>674
> そもそもどんな型でも文字列が返ってくる以外は入れられない。
結局、今のHaskellでは、["a", "b", ["c", "d"]] のような表現はできないと言ってるだけね?
関数型言語としてなぜそんな表現力を制限するのか分からん。どういう場合に使いたくなるかは知らんが。
>>676
> 入力->出力が素直だからこその関数プログラミングだってのに。
入力->出力が素直ってどういうこと? 自然変換のことじゃないよね?www
関数プログラミングは入力->出力になってればそれで十分だと思うが
>>68
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
> となるような関数fはどのように書けるでしょうか
結局もとのこの問題について、“一般の関数型言語”でのfの不可能性をだれも論証できないのかな?
(要点さえ分かれば簡略でよいが)

686:デフォルトの名無しさん
17/06/13 21:34:21.04 BDZwTNDo.net
型は単に「欲しい最終データが手に入ればよい」っていうよりは
ある種の性質がコンパイル時に保証されてるってのがありがたい
エンバグも検出しやすい
他の言語だと[Any] なListがあったりするけど(例えばScala)
よくあんなの使うなーって思う
>>678
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
これはリテラルでこう書いてる以上、 fがどんな値を返そうと
左辺は要素が3のリストで右辺は要素が4のリストだから
パターンマッチに成功するわけない

687:デフォルトの名無しさん
17/06/13 21:39:23.64 Qd0f53fz.net
>>678
ここにいる人たちは俺もあんたも含めて誰も証明できないことは、
いままでの一連のレスですでに分かっているはず。
あんたの投げかけた議論に誰もあんたの望むようには応えられないことも分かっただろ。
あんたの話はhaskellという小さな枠組みを遥かに越えてるんだよ。
いい加減スレチだってことに気づこうよ。
頼むから、一般の関数型言語における可能性や証明の議論は大学でもっと頭のいいヤツらとしてくれ。

688:デフォルトの名無しさん
17/06/13 21:43:22.47 RNIsqaqt.net
中途半端な数学屋なんて全然怖くないのに
数学系と聞いて逃げるHaskellプログラマ大杉

689:デフォルトの名無しさん
17/06/13 23:14:18.88 qhE8awpR.net
とりあえずこんなもんでどう?
URLリンク(ideone.com)

690:デフォルトの名無しさん
17/06/13 23:32:43.89 qhE8awpR.net
どうせならFoldableにすりゃよかったな
ま、いっか

691:デフォルトの名無しさん
17/06/13 23:59:28.85 pYqK9vAB.net
Haskell の枠組みにとらわれないなら、自分専用関数型言語の
文字列リテラルを 682 が示した Nest みたいに自由に定義すればいいもんな
これで解決だ

692:デフォルトの名無しさん
17/06/14 00:01:03.56 ZT/uD64c.net
ideoneやpaiza.ioのようにhaskellコードのコンパイルと実行を同時にしてくれるようなローカルアプリはありますか?
補完とかはなくてもいいですし、exeも生成しなくていいのですが

693:デフォルトの名無しさん
17/06/14 00:24:00.03 VydZF3sS.net
["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、
チャーチ・ロッサー性で説明できる。
チャーチ・ロッサー性は、簡単に言うと、計算の順番を変えても
最終的な計算結果が変わることが無いという性質。
もし上記のようなfがあるとすると、以下の2つの式の計算結果が同じでなければならない。
なぜなら、これら2つの式は、一番内側のfを先に計算するかどうかの違いしかないから。
null(tail(tail(tail ["aa","bb",f["cc","dd"]])))
null(tail(tail(tail ["aa","bb","cc","dd"])))
しかし、計算すればわかるが、上はtrueで下はfalseになるので矛盾する。
よってfは存在し得ない。
本当は、型なしラムダ計算に落としこんでからやる必要があるけど、
(型なしラムダ計算にチャーチ・ロッサー性があることは証明済み)
骨子としてはこんな感じ。

694:デフォルトの名無しさん
17/06/14 00:35:10.46 Ei72hKB9.net
要するにLispのマクロの ,@ みたいな展開をしたいってことか?

695:デフォルトの名無しさん
17/06/14 02:36:17.24 jR7LtVt0.net
>> 683
まあ、こういうデータ構造なんか既視感あるよなと思ったら、リストじゃなくてツリーだよね
つうか Data.Tree がまんまそれ

696:デフォルトの名無しさん
17/06/14 05:34:36.84 .net
>>681

この人強そう

697:デフォルトの名無しさん
17/06/14 09:21:04.82 Zur2LRZk.net
>>678
>関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。
そこまで分かってて、f ["c","d"]が単一のStringにならざるを得ない。
つまり
["a","b","c","d"]
ではなく、
["a","b","cd"]
の様な単一の値としてしか返りようがないって分かるだろ。
あれか、複数の値を返せってか。
従来の値が欲しい方はどうすんだよ。

698:デフォルトの名無しさん
17/06/14 09:53:35.84 dwFQOh88.net
>>679
> 他の言語だと[Any] なListがあったりするけど(例えばScala)
> よくあんなの使うなーって思う
その例は極端すぎる。Anyは論外。型の否定と�


699:ッじ。(Scalaも推奨はしてないと思うが) > fがどんな値を返そうと左辺は要素が3のリストで ふつうに考えてそうだよね。 そこを以下のように暗算して、できるかと思っちゃった。 f[x, y] = x : [y] とすると、 [a, b, f[c, d]] = a : b : (c : [d]) = a : b : (c : d : []) = a : b : c : d : [] = [a, b, c, d] >>680 というわけで、ここは俺が暗算で頭の体操してミスってた。 優しく拒否してもらったがスマンw >>686 > ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、 > チャーチ・ロッサー性で説明できる。 折角だが今の件はチャーチ・ロッサー性(合流性)は関係ないと思う。 合流性以前の到達性が問題なので。



700:デフォルトの名無しさん
17/06/18 12:36:58.87 P8yIezdD.net
配列xsとysと引数を2つ取る関数gがあって、
f g xs ys = map (\x -> map (g x) ys ) xs
となるような関数fってあったりしますか?
例えば
f (+) [1,2,3] [4,5,6] = [ [5,6,7], [6,7,8], [7,8,9]]
となるような関数です

701:デフォルトの名無しさん
17/06/18 12:50:16.34 aJwV86NO.net
>>692
hoogle で調べてみても、それっぽいものが見当たりませんね。
少なくとも標準ライブラリにはありません。
なので、その定義に自分で適当に名前を付けて使ってください。

702:デフォルトの名無しさん
17/06/18 12:56:47.67 P8yIezdD.net
>>693
ありがとうございます
ないならないで問題ありません
たまに使うのですが、既にあるならわざわざ定義するのも無駄だなと思っただけなので

703:デフォルトの名無しさん
17/06/18 15:28:29.26 sgvQsVTs.net
>>692
f g xs ys = concatMap (¥x -> map (g x) ys ) xs
でいいなら(つまりリストを1段階潰していいなら)あるよ。
g <$> xs <*> ys
がその答え。

704:デフォルトの名無しさん
17/06/18 17:41:11.73 VE2N9ory.net
>>692
zipWithに配列の配列渡せば行けるか?と書いてみた。
zipWith (map.(+)) [1,2,3] $ repeat [4,5,6]
うん。
素直に関数作った方がいいね。
リスト内包表記なら分かりやすいと思う。
f g xs ys = [map (g x) ys | x <- xs]

705:デフォルトの名無しさん
17/06/18 17:41:54.37 VE2N9ory.net
x配列の配列
oリストのリスト

706:デフォルトの名無しさん
17/06/18 22:40:07.66 3urB1Yg8.net
これで行けるよ。
f x = fmap . (. (:[])) . liftA2 x
f (+) [1,2,3] [4,5,6]
[[5,6,7],[6,7,8],[7,8,9]]

707:デフォルトの名無しさん
17/06/19 05:32:16.99 DP5W49kg.net
そういう関数ってすでにある?って質問なのにオレオレ実装載せてく人たち…

708:デフォルトの名無しさん
17/06/19 06:40:21.02 iu3OXdki.net
しかも、質問者の実装が一番素直で分かりやすい

709:デフォルトの名無しさん
17/06/19 07:45:05.62 f7LtpRLv.net
隙あらば実装

いや、プログラム板ではそれでいいんじゃないか。

710:デフォルトの名無しさん
17/06/19 10:22:09.65 Gx/WCs0N.net
組み込みの関数でラムダ式を隠蔽してしまうことには意味があるんじゃないか
ところで質問者の例だと結果が可換なのでそうじゃない例の方が良かったのでは
f (+) [1, 2, 3] [1, 3, 5] -> [[2,4,6],[3,5,7],[4,6,8]]
f (+) [1, 3, 5] [1, 2, 3] -> [[2,3,4],[4,5,6],[6,7,8]]
とか

711:デフォルトの名無しさん
17/06/19 10:46:07.27 6iW/OLTz.net
>>702
それならば、あなたはどのような意味を見いだしたのかまでちゃんと言わないと。
何にどのような意味を見いだすかは人それぞれですし。
私は、ソースは人間が読みやすい事に最大の意味を見いだします。
なので、計算結果を容易に想像できるという点で、
>>692 や >> 696 の下の定義は好きですね。

712:デフォルトの名無しさん
17/07/01 02:37:46.49 JHLae2yG.net
IOモナドは命令書という喩えが一番しっくり来た

713:デフォルトの名無しさん
17/07/01 08:12:10.07 yvgbUlYU.net
IOモナドっつーか、モナドは難しく考えんで良いだろと。
IO String >>= String
IO String >> は結果を捨てる。>>= ¥_ -> の略記。
return String ってしたらIOなString返るから、return使えばモナドの途中で純粋な関数で加工出来る。


それがIOモナドにも具体的な型にも依存しない汎用的な表現が

m a >>= a

ってだけ。

これだけ覚えれば使うにゃ十分だし、使ってるうちにただの型クラスやってわかる。
結局型クラスも型を受け取れる型ってだけで、ただの型でもあるから、純粋関数の結果としてString返すと、IO StringとStringは型が違うよって怒られる。

だからIO Stringにする為にIO Stringな関数か、return使いましょうってだけ。

具体的な型を考えれば何のことはない。
returnはそう考えればまあ自然なんだが、リターンってよりレシーブって印象。

714:デフォルトの名無しさん
17/07/01 09:35:49.67 yvgbUlYU.net
main = getLine >>= return.tail >>= putStrLn
getLine
一行入力でIO String生成。

>>=
getLineに生成されたIO StringをStringとして右辺に渡す。
return.tail
tailは受け取ったStringの先頭を省く。
そのままだとStringのままで、IO Stringを受け取る次の>>=に渡せないので、returnでStringをIO Stringにして返す。
>>=(2番目)
最終出力のputStrLnに向けてIO StringをStringにして渡す。
putStrLn
受け取ったStringを改行付き出力。
説明のために長く書いたけど、型を揃えれば良いって分かればこうも書ける。

main = getLine >>= putStrLn.tail

何もないところからIOを生成するmain = 直後の関数以降は基本的に純粋な型を受け取ってIOな型を返せばコンパイラ通るので、何の役にも立たないけどこれもコンパイル通る。

main = getLine >>= return.tail

putStrLnも関数である以上、何らかの値を返してるので見ようと思えば見れる。

main >>= putStrLn.tail >>= print

()にIOを付けたIO ()が返ってると分かる。

715:デフォルトの名無しさん
17/07/01 10:27:56.55 8Dk+ywm5.net
IOと純粋関数の関係がどうしても理解できなかったけどwiki読んだらやっとわかったからオススメ
URLリンク(wiki.haskell.org)

716:デフォルトの名無しさん
17/07/03 20:20:17.13 n7+jlCYi.net
stack使ってるのですが、openFileでカレントディレクトリ以外のファイルを指定って出来ないんですかね?

717:デフォルトの名無しさん
17/07/03 20:31:50.76 UwBLUxpl.net
stack関係あったっけ?
何となく¥を¥¥ってしてないだけじゃないかと予想。

718:デフォルトの名無しさん
17/07/08 21:56:26.43 A29giBA8.net
タプル作ろうと思ってHoogleで
f :: a -> b -> (a, b)
f a b = (a, b)
となるような関数探したら見つからないんだけどもしかしてない?
割と使いそうなイメージなんだけど

719:デフォルトの名無しさん
17/07/08 22:11:48.22 TJZt+GMQ.net
どういうときに使いたいのさ
curry/uncurry ならたまに使うけど

720:デフォルトの名無しさん
17/07/08 22:18:49.21 ZOCy/rmL.net
これで
URLリンク(wandbox.org)

721:デフォルトの名無しさん
17/07/08 22:48:00.26 Tq0FsZsH.net
>>710
タプルコンストラクタ
$ ghci
GHCi, version 8.0.2: URLリンク(www.haskell.org) :? for help
Prelude> :t ((,))
((,)) :: a -> b -> (a, b)

722:デフォルトの名無しさん
17/07/08 22:53:26.22 AXnSyqoB.net
>>713
おお、まさにこれです
ありがとうございます

723:デフォルトの名無しさん
17/07/10 01:15:03.97 IPU+pjhL.net
すみません traceデバッグについてですが
ある変数に色とかで印を付けて
IOとは別の専用簡易コンソールに出力表示とか
簡単に出来ない物でしょうか。

724:デフォルトの名無しさん
17/07/15 19:13:14.12 bXz+G42e.net
GHC 8.2 で実装予定の backpack なるものが一体
現在のどのような問題をどのように解決することを目指したものか、
分かる方いますか?

どうも、モジュールシステムの拡張みたいですが...

725:デフォルトの名無しさん
17/07/17 23:01:46.61 4tJqH+Y+.net
ご冥福

726:デフォルトの名無しさん
17/07/18 03:45:58.72 6+yJKiYC.net
すぐりって読むのだと思ってました

727:デフォルトの名無しさん
17/07/19 22:41:31.74 BqP8obNe.net
URLリンク(twitter.com)

これ?

728:デフォルトの名無しさん
17/07/21 21:39:30.54 kkMUVecO.net
文字列のリストがあって、それぞれの要素を順番にputStrLnするだけならmapM_よりtraverse_の方がいいですか?

729:デフォルトの名無しさん
17/07/22 10:13:22.40 /BTLbKbr.net
Haskellerなんですぐ死んでしまうん

730:デフォルトの名無しさん
17/07/22 11:57:08.36 /9K4Ed3n.net
えぇ・・・

731:デフォルトの名無しさん
17/07/22 14:53:16.39 4NLvcjES.net
必要以上に多相にしたり制約を弱めるのは典型的な bad practice
concat のかわりに join 使ったりしないでしょ

732:デフォルトの名無しさん
17/07/22 14:54:33.27 4NLvcjES.net
ライブラリコード書くときには可能な限り型クラス制約を弱めて多相に
利用するコードではむしろ反対に

733:デフォルトの名無しさん
17/07/22 17:58:06.65 1dVz8HPB.net
>>723
つまりtraverse_の方がいいって認識でいいですか?

734:デフォルトの名無しさん
17/07/22 19:58:53.32 AuEOuo+E.net
Haskellerはマジでメンヘラが多い

735:デフォルトの名無しさん
17/07/22 22:29:16.45 wIG0mEjF.net
パフォーマンスモニターを提供する ekg というライブラリがあるんだが、
これ、なかなか凄いな。

統計情報がHTTPプロトコルでリアルタイムに提供されるから、
モニタリング専用のアプリを使わずとも普通のブラウザで見れる。
カウントするものをプログラムの中で定義することもできるみたいだし、
けっこう本格的だ。
パフォーマンスチューニングが捗りそう。


ちなみに、俺はこのライブラリの存在をここで知った。
URLリンク(www.stephendiehl.com)
このブログポストに商業アプリ制作にHaskellを使う際の心得みたいなことが書かれていて、
Performance and Monitoring の項で ekg が紹介されている。
このブログの他のポストもなかなか面白いから暇人は読んでみるといいよ。

736:デフォルトの名無しさん
17/07/23 00:17:34.21 m+ryfkmk.net
>>725
ちょい待ち >>723>>724 のアドバイスに従うなら、そこは mapM_ でしょ

737:デフォルトの名無しさん
17/07/24 20:13:14.08 Rqhmx9U8.net
他の言語の書き方が良くなると聞いて始めてみたが、難しい・・・
というか今のとこ恩恵が分かんない^^;

738:デフォルトの名無しさん
17/07/24 20:20:07.13 RBhDn3mI.net
他言語の書き方は俺は良くなったな

739:デフォルトの名無しさん
17/07/24 21:03:53.98 h3biSAhr.net
過去何度か似たような質問や意見が出てるが、
今までこういう書き方だったのがHaskellのお陰でこう改善された、
という具体例が挙がった試しがない。
改善例が載っているブログなどの紹介すらない。

俺の中では、前後の違いを明確に説明できないものは改善とは認められない。
原因がはっきりしない事はあるだろうが、改善したと言うからには
少なくとも違いははっきりと説明してほしい。

それができないと言う事は、きっと違いが説明できないほど微妙で曖昧な変化を
改善と言っているのだろう。

740:デフォルトの名無しさん
17/07/24 21:22:17.61 emVJufwa.net
いやそんなの最初からちゃんとやれよと思うかもしれんが非関数型の言語を触っているときに比べて入出力をはっきりと意識するようにはなった
特に動的型付けだと何も考えなくても動くだけのものは作れてしまうからな

741:デフォルトの名無しさん
17/07/24 21:27:21.43 jM5xaigZ.net
大リーグ養成ギブスはめられてるような気持ち

742:デフォルトの名無しさん
17/07/24 21:56:08.66 RBhDn3mI.net
>>731
     /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ    ___
     /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、  /     ヽ
    /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/  リ!: ::/ノ  l`ヽl !: : |: : : :l: :l: リ / そ そ お \
   /: : ヽヾ/: : l/::l |/|||llllヾ,、  / |: :/ , -==、 l\:::|: : : :|i: | /   う う  前  |
.   /: : : //ヾ ; :|!: イ、||ll|||||::||    ノノ  イ|||||||ヾ、 |: ::|!: : イ: ::|/   な 思 が
   /: : ://: : :ヽソ::ヽl |{ i||ll"ン    ´   i| l|||l"l `|: /|: : /'!/l     ん う
 ∠: : : ~: : : : : : : :丶ゝ-―-      ,  ー=z_ソ   |/ ハメ;, :: ::|.   だ ん
   i|::ハ: : : : : : : : : : : 、ヘヘヘヘ     、  ヘヘヘヘヘ /: : : : : \,|.   ろ な
   |!l |: : : : : : : : :、: ::\    、-―-,      / : : :丶;,,;,:ミヽ   う  ら
     丶: :ハ、lヽ: :ヽ: : ::\__  `~ "      /: : ト; lヽ)   ゝ
       レ `| `、l`、>=ニ´        ,  _´ : :} `   /
         ,,、r"^~´"''''"t-`r、 _  -、 ´ヽノ \ノ   /    お ・
       ,;'~  _r-- 、__     ~f、_>'、_         |  で  前 ・
      f~  ,;"     ~"t___    ミ、 ^'t         |  は  ん ・
      ,"  ,~         ヾ~'-、__ ミ_ξ丶     |  な  中 ・
     ;'  ,イ ..          ヽ_   ヾ、0ヽ丶    l         /
     ( ;":: |: :: ..          .`,   ヾ 丶 !    \____/
     ;;;; :: 入:: :: ::      l`ー-、   )l   ヾ 丶
     "~、ソ:: :い:: :     \_  ノ ,    ヾ 丶

743:デフォルトの名無しさん
17/07/24 22:18:09.60 Dtg+FNV7.net
俺は大幅に改善されたので満足です

744:デフォルトの名無しさん
17/07/24 22:30:09.86 DrMH5w+T.net
はすける始めたら彼女とセフレが出来ました!

745:デフォルトの名無しさん
17/07/25 00:51:32.66 oURyYS1P.net
デザインパターンのようなものが自然に学べる(要出典)

>>732
IOモナドを学んでしまうとvoidとかなんやねん!て気持ちになる

746:デフォルトの名無しさん
17/07/25 02:18:19.45 kRJD7bjt.net
IO () ← なんやねん!

747:デフォルトの名無しさん
17/07/25 11:48:16.84 QpQhPQ2k.net
空のタプルやね
引数にタプル使わないけど戻り値には使う
他の言語では最も書きにくいパターンを敢えて書く


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch