[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/10 00:15 / Filesize : 342 KB / Number-of Response : 1029
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型プログラミング言語Haskell Part33



1 名前:デフォルトの名無しさん [2020/02/10(月) 18:17:36 ID:L6eYQqyh.net]
関数型プログラミング言語 Haskell について語るスレです。

Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/

前スレ
関数型プログラミング言語Haskell Part32
https://mevius.5ch.net/test/read.cgi/tech/1548720347/

473 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 02:01:31.05 ID:hzZ7uEzq.net]
>>460
です
自己レスです
色々調べて一応Complex RationalにNumのinstance入れる方法見つけました
しかしかなり裏技というか、あまり関心しない方法かもしれません
やはり正攻法は>>462のようにカプセル化する方だと思いますけど、せっかく見つけたのでうpします
>>462と同じく0,3,4i,7/2+7/2iが同一円周上にあるか確認するプログラムです
ついでにabsも使えるようにしてあります
absがいらないならsqrt=の部分がなくても動作します

474 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 02:03:13.00 ID:hzZ7uEzq.net]
import Data.Ratio
import Data.Complex

instance (Integral a)=> Floating (Ratio a) where
sqrt = fromRational.toRational.sqrt
.fromRational.toRational
instance (Integral a) => RealFloat (Ratio a) where
floatDigits = floatDigits.fromRational.toRational
decodeFloat = decodeFloat.fromRational.toRational
scaleFloat k x = if k > 0 then x*2^k else x/2^(-k)

475 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 02:03:23.39 ID:hzZ7uEzq.net]
i = 0:+1%1

onCircle a b c d = id
$ (==0)
$ imagPart
$ ((a-c)/(b-c))/((a-d)/(b-d))

(a,b,c,d)=(0,3,4*i,7/2+7/2*i)

main = do
print $(1/2+3/4*i)/(5/6+7/8*i)
print $ onCircle a b c d
print $ ((a-c)/(b-c))/((a-d)/(b-d))
print $ abs $ 2+3*i
print $ abs $ 15+8*i
----
618 % 841 :+ 108 % 841
True
4 % 7 :+ 0 % 1
8118979690322419 % 2251799813685248 :+ 0 % 1
17 % 1 :+ 0 % 1

476 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 13:15:04.05 ID:T3msgi7J.net]
純粋に興味のみからすごいHaskellを読んでいるのですが、みなさんはなぜHaskellを使っているのですか?

477 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 13:35:41.51 ID:EwmIpy36.net]
宣言的に書けた時の気持ち良さがたまらんから

478 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 14:03:13.58 ID:T3msgi7J.net]
>>472
やはり実用よりは趣味ということですね。

479 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 14:05:39.74 ID:14+GNjHV.net]
Haskellで書かれた実用的なアプリ無いからな。

480 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 17:37:30.47 ID:acNOQ2m1.net]
『Haskellによる関数プログラミングの思考法』って出たの3年前なのに書籍版はもう絶版なんだな
旧版を元にした『関数プログラミング入門』の方はまだ売ってるけど

481 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 18:22:32.54 ID:r4XBIbpb.net]
3年で消えてもらった方が新しい商品が売れるという実用的思考
永久保存など消費者の趣味だ



482 名前:デフォルトの名無しさん mailto:sage [2020/09/05(土) 18:33:16.32 ID:mscSzbua.net]
>>474
pandoc は?

483 名前:デフォルトの名無しさん mailto:sage [2020/09/06(日) 01:05:18.13 ID:lOdtO6cj.net]
>>474
Elmコンパイラは?
PureScriptコンパイラは?
spagoは?

484 名前:デフォルトの名無しさん mailto:sage [2020/09/06(日) 01:51:45.47 ID:Z433FiXx.net]
HaskellっていうかParsecが優秀なんだろな

485 名前:デフォルトの名無しさん mailto:sage [2020/09/06(日) 22:23:29.89 ID:YBPAq9+r.net]
>>471
パーサーを書く必要があって使い始めた

486 名前:デフォルトの名無しさん mailto:sage [2020/09/07(月) 11:55:03.70 ID:xmFuETjj.net]
純粋に興味からです

487 名前:デフォルトの名無しさん mailto:sage [2020/09/07(月) 17:09:40 ID:6+huFxV7.net]
>>467
マクレーンの圏論とか読んでも果てしなく遠回りするだけだぞ。

488 名前:デフォルトの名無しさん [2020/09/07(月) 17:57:43 ID:kXMphwO9.net]
>>482
ベーシック圏論はどうですか?

489 名前:デフォルトの名無しさん mailto:sage [2020/09/07(月) 18:10:28 ID:oaoIrH3d.net]
haskellのモナド理解するだけなら圏論いらないからね

ベーシック圏論は内容を限定して敷居の低い例を使っているので相対的には
読みやすいけど、基礎的な数学の知識がないと例が理解の助けにならないのは同じ

490 名前:デフォルトの名無しさん mailto:sage [2020/09/07(月) 20:28:07.77 ID:xmFuETjj.net]
関手って圏が持つ「対象と射」同志の関連付けのことだよね?
なぜfmap関数を定義すると関手を実装したことになるの?

491 名前:デフォルトの名無しさん mailto:sage [2020/09/07(月) 21:15:30.28 ID:3sLeGs6G.net]
fmapという名前が変
関手は射と見なせる



492 名前:デフォルトの名無しさん [2020/09/08(火) 01:49:12.47 ID:L2ZCtfX62]
副業、大手も制度着々…コロナ禍、働き手は空き時間活用
https://www.itmedia.co.jp/business/articles/2009/07/news111.html
富士通「年収3500万円」の衝撃 ソニー、NECも戦々恐々の「グローバル採用競争」
https://www.itmedia.co.jp/business/articles/2008/21/news031.html
東大の起業ラッシュは本物か、大学発ベンチャー数日本一の実力
https://business.nikkei.com/atcl/NBD/19/special/00448/
AI研究の第一人者、東大・松尾研でも起業ラッシュ
https://business.nikkei.com/atcl/gen/19/00158/051900002/?i_cid=nbpnb_arc
失敗は認める、多数決はダメ。拡大する「社会起業家集団」の作り方
https://newswitch.jp/p/23033
新卒“即”起業せよ。社会起業家への最短距離に挑む若者たち
https://newswitch.jp/p/23020
人々の共感を得られないと潰される時代。
https://news.yahoo.co.jp/articles/37aef71415e8181ce8451e27feb3983bf1f6f9cd
ゼロから起業するよりも事業承継(小さな会社の買収)が圧倒的に有利である3つの理由
https://honsuki.jp/pickup/17323.html
「エース人材だって起業OK」、NECは挑戦者が集う場をつくる
https://business.nikkei.com/atcl/gen/19/00106/012900003/
NECなど「出向起業」 大企業人材、起業しやすく
https://www.nikkei.com/article/DGXMZO61733720Q0A720C2TJ1000/

493 名前:デフォルトの名無しさん [2020/09/08(火) 01:52:19.60 ID:L2ZCtfX62]
70億円調達のネットショップ作成サービスhey、「我の弱い人同士の組織力」武器にEC市場シェア拡大目指す
https://www.businessinsider.jp/post-219205
【劇団ノーミーツ1】役者も客も会わないオンライン演劇で7000人動員。制作チームは全員20代、半分は会社員
https://www.businessinsider.jp/post-219184
「ガーナのゴミ」がなぜ1点500万円の作品に変わるのか
https://www.businessinsider.jp/post-208314?itm_source=article_link&itm_campaign=/post-219184&itm_content=https://www.businessinsider.jp/post-208314
利用、無料。日本版衛星データプラットフォーム「Tellus」がすごい理由…“宇宙の視点”でビジネスはこう変わる
https://www.businessinsider.jp/post-219279
「起業ブーム」が新たなフェーズに 大学発ベンチャーへの想い
https://forbesjapan.com/articles/detail/35527
かつて学者がやっていたことを、今は起業家がやっている
https://diamond.jp/articles/-/232874
番号やアドレス不要の無料通話アプリRe-mo登場 ドワンゴが配信開始
https://japanese.engadget.com/ios-dwango-re-mo-072853620.html

494 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 09:53:26.80 ID:TuvEFz+K.net]
勝俣「シャー!」

495 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 10:39:29.87 ID:o85d1us6.net]
圏の圏な

496 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 11:37:10.69 ID:sfIbn56V.net]
圏論いらずで、モナド理解するのにどうすりゃいいの?

497 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 12:18:16.37 ID:/Y+BdKRx.net]
do記法が使えるようになる

モナド=>モナド則を満たす=>do記法はモナド則の別バージョン

結局のところ、モナドはdo記法を作りたかった。よって、先頭の話になる。

498 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 12:43:31.80 ID:/Y+BdKRx.net]
ちょっと嘘だな
488は既にあるモナドを使う場合の話で

自分でモナドを作ってみたいのなら
モナド則を満たしていることの確認が必要 
ってことで、モナド則の勉強も必要

個人的にモナドが一番分かり易かったのは、↓かな

サルでもわかるIOモナド@-B
hot-heart-cool-mind.seesaa.net/article/393131366.html

499 名前:デフォルトの名無しさん [2020/09/09(水) 12:59:11.96 ID:7PwBIIdR.net]
モナドというのが何なのか知らないのですが、モナドが何か分かっていないとモナドは使えないものなんですか?

500 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 13:33:56.84 ID:Ss6OMKhc.net]
Haskellで出てくる演算子の読み方一覧ってないですか?

501 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 18:46:46.75 ID:7PwBIIdR.net]
>>494
それともHaskellという言語は何でもかんでもある数学的に説明できるように設計されていて気持ちがいいというだけのことでしょうか?



502 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 18:50:44.11 ID:N/YnHGom.net]
低学歴の数学弱いなのに、頑張ってHaskellで開発の会社に潜り込んで仕事してる人も居るから。

503 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 19:41:50.73 ID:YuHH3QPI.net]
高卒のワイでもプロのHaskellerになれるん?
その方法教えて欲しいわ。

504 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 19:44:40.13 ID:7PwBIIdR.net]
仕事でHaskellを使っている会社があるのですか?
実用面でのHaskellの利点があるということですか?

505 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 19:58:00.07 ID:7PwBIIdR.net]
「Haskellの美しさを知っている人は、人生に絶望することはない。Haskellで世界を変えたい。」などと表紙に書かれているHaskellの本が
ありますが、そんな大げさなものでしょうか?

単なる一プログラミング言語ではないんですか?

506 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 20:15:19.85 ID:+oYkcMI9.net]
型システムが強力ってだけで実用上有利
現実、型がしょぼい言語よりバグ減るし、
型から関数探せるから既存プログラムの再利用性高いし、
ウェイがノリで作る「イケてる」オレオレライブラリなんかにも型の合うある程度まともな設計が求められるし

507 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 20:16:27.76 ID:YuHH3QPI.net]
それは持てる者がほざく絵空事やでw

508 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 20:56:40 ID:/Y+BdKRx.net]
んじゃ、async/awaitがモナドで実装できるんやでー

詳細はしらんけどw

509 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 22:27:03 ID:M9aZojkl.net]
IDEは何がおすすめ?

510 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 02:20:35 ID:6Lrmk0HC.net]
らっきょ

511 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 08:33:57.45 ID:OHVt/ux7.net]
俺も聞きたいけどVScodeじゃ辛い?



512 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 13:10:19.99 ID:he9lsIhb.net]
>>500
理解した途端にこんなしょー

513 名前:烽ネいことでドやってたのかと絶望するよ。 []
[ここ壊れてます]

514 名前:デフォルトの名無しさん mailto:sage [2020/09/11(金) 22:58:53.84 ID:dNbZ7rGGn]
デキる人ほどフリーランス化する?★働き方改革
https://www.youtube.com/watch?v=ALflcwYOJtQ
年収890万円以下は社会のお荷物★騙される労働者
https://www.youtube.com/watch?v=CAp-ZrJpF54
騙されたくなかったら勉強しろ★他人のルールは損をする
https://www.youtube.com/watch?v=s176O6qKuPw
底辺の99%は一生底辺★10年後が見えない同僚たち
https://www.youtube.com/watch?v=4Mfiwn2sPD8
稼ぎたければ働くな★4千万円ぽっちも稼げないのはなぜ?
https://www.youtube.com/watch?v=Fi7bILN4wes
サラリーマン思考では儲からない理由
https://www.youtube.com/watch?v=iW6oAo0q0ZI
で、無職は稼いでるの?★YouTube収益はアホにも分かりやすい
https://www.youtube.com/watch?v=md0WPAsfarY

515 名前:デフォルトの名無しさん [2020/09/12(土) 10:38:44.00 ID:A2+hHxph.net]
[分数モナド](https://ncatlab.org/nlab/show/Grothendieck+group+of+a+commutative+monoid)

日常生活でも目にする`2 / 3`のような分数表記はモナドになっている。
吸収元の問題があるので、ネタとしては引き算`2 - 3`の方が扱いやすいが、
引き算の場合、`2 - 3 = - 1`のように計算してしまった結果が使われ、
日常生活では生々しいモナド表記はあまり使われない。その点、分数では、
直積からのコンストラクターをもろに使った漢な表現が
日常生活の中で使われている。

分数は、モナドを使うことと、モナドを理解することは別腹という
良い例になっている気がする。分数がモナドになっていることが生きてくるのは、
システムがそれなりに複雑になってからじゃないかと思う。抽象化には
コストがかかるので、そのコストに見合った見返りが必要になるが、
システムが簡単だと、抽象化のコストをペイできない。

分数モナドは有名な例なので、何処かのブログで紹介されていると思うが、
見たことがないので、書いてみた。ホームが可換モノイドの圏なので、
オレオレモナドになってしまうが、モナド則の`QuickCheck`はできるので、
圏論の練習になるかもしれない。

516 名前:デフォルトの名無しさん mailto:sage [2020/09/12(土) 20:26:45.44 ID:TbuoUVLB.net]
は?何言ってんの

517 名前:デフォルトの名無しさん [2020/09/13(日) 08:12:50.88 ID:Tso/1gLY.net]
ひ?何言ってんの

518 名前:デフォルトの名無しさん mailto:sage [2020/09/13(日) 14:14:05.81 ID:7XfXIlf2.net]
>>509
return と >>= は何になるんですか?

519 名前:デフォルトの名無しさん mailto:sage [2020/09/13(日) 15:14:54.14 ID:Gippd8g0.net]
しらないけど
return x = x / x
ぐらいしか定義できなさそう

520 名前:デフォルトの名無しさん [2020/09/13(日) 21:12:53.92 ID:Tso/1gLY.net]
ふ?何言ってんの

可換モノイドの圏は集合の圏の
[部分圏](https://ncatlab.org/nlab/show/subcategory)だが、
集合の圏ではない。したがって、分数モナドは、
Haskellの`Monad`のインスタンスにならない。
例えば、次のような実装を考えると、

``` code
newtype Bunsu a = Bunsu {
runBunsu :: (a, a)
} deriving (Show, Functor)

instance (Eq a, Semigroup a) => Eq (Bunsu a) where ...
instance (Semigroup a) => Semigroup (Bunsu a) where ...
instance (Monoid a) => Monoid (Bunsu a) where ...
instance (Monoid a) => Group (Bunsu a) where ...

bunsu_pure :: (Monoid a) => a -> Bunsu a
bunsu_pure = ...
```

縛り`Monoid a`が邪魔をして、`Bunsu`は`Applicative`のインスタンスに
できない。それでも、通常の関数の形でなら`bunsu_pure`と`bunsu_join`は
書けるので、モナド則のチェックはできる。ただし、`Bunsu`は、
可換モノイドの圏でのモナド則は満たすが、集合の圏でのモナド則は満たさない。

質問への直接の答えは避けるが、可換モノイドの圏で考えないと
答えは得られない。

521 名前:デフォルトの名無しさん [2020/09/13(日) 23:57:07.12 ID:Tso/1gLY.net]
へ?何言ってんの

もしかすると、何言ってんのが前の投稿にかかっちゃったかもしれない。
何も考えずに、何言ってんのおじさんプレイを楽しんでいるだけなので、
気にしないでほしい。

ついでなので。
`return x = x / x`という選択は、集合の圏では、取りうる唯一の選択肢かも
しれない。自分も他に思いつかない。しかし、可換モノイドの圏では、
他にも選択肢がある。それも含めて、
[記事](https://ncatlab.org/nlab/show/Grothendieck+group+of+a+commutative+monoid)
に全て書いてある。他人事なので断言してしまうが、この記事より詳しい
分数モナドの解説は地球上には存在しない。しかし、悲しいかな、
Haskellの解説記事と同じで、

* わかる人にはわかるが、
* わからん人にはなるほどわからん

といういつものパターンになっていると思う。解説案件の宿命かもね。



522 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 02:32:09.85 ID:TxRaIMAU.net]
>>=は何ですか?

523 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 02:44:47.64 ID:SnB9iMGf.net]
圏論わからんからなんもわからん

524 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 16:41:03.56 ID:TxRaIMAU.net]
Monad という概念が数学の圏論の Monad から来るのはよく解説が見つかるんですが、Applicative (≒Monoidal) については数学からの意味付けが見つかりません
コレ数学的にはなんなんですか?

525 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 23:29:35.74 ID:XfiH3m4/.net]
そのままじゃん アプリカティブファンクター
なんだから、そのまま日本語訳でよくね
つまり、関手 プログラマーにとって使いやすくしただけ

ところで、”Applicative (≒Monoidal)”なのか?
こっちの方がい意味不明なんだが
モノイドって意味なら、≒モナド の方

モナイド則=モノイド則 モナドの方は、自己関手って条件が付くだけ

しらんけど

526 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 00:17:11.21 ID:wUKRYY2O.net]
>>519
まだ自分でハッキリ確かめたわけじゃないんですけど
Applicative と Monoidal は同型なんだそうです

https://qiita.com/Guvalif/items/7f893d9a078e03c9e425

まだこっちはどういう意味で“同型”になるのかわかってませんけど
数学的な意味でのMonadは英語のwikiに詳しく説明が載ってて↓
https://en.m.wikipedia.org/wiki/Monad_(category_theory)
このFormal DefinitionがまさにHaskellのモナド則に繋がっていくのは確かめました
問題はApplicativeは圏論のどの概念に該当するのかの説明がサッパリ見つからないんです

527 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 02:19:25.61 ID:PObv6BQ8.net]
(a -> b) -> (m a -> m b)
m (a -> b) -> (m a -> m b)
(a -> m b) -> (m a -> m b)
こいつらは中央の->と左右の->を区別してないから数学的な意味が見えない

returnとjoinは->が一つしかないから問題ないが

528 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 10:15:51.98 ID:TeSbfrM9.net]
>>521
そう、Haskellの圏論がらみの話はその“冪対象”(exponential object)が絡むのがややこしい
しかしFunctorは当然としてMonadも冪対象を用いないで形式化されてる(というより計算論の世界への応用のずっと以前からある)
Applicative(=Monoid?)はどやねんという話なんです
圏論の世界ではなかったものが計算論の世界に導入されてから考え出されたもんなんですかねぇ?

529 名前:デフォルトの名無しさん mailto:sage [2020/09/16(水) 01:31:29.62 ID:yuR5T5xB.net]
strong lax monoical functor

530 名前:デフォルトの名無しさん mailto:sage [2020/09/16(水) 22:12:52.40 ID:CfmtxJKj.net]
モノイド圏とかモノイド対象とかあんのだけど、モノイド(モノイダル)関手ってのもあんのね

読む気は無いんだけど、アプリカティブ関手とモノイダルXXが同型ってのは無いと思うが
っておもったけど、関手同士なんだから、いくつか条件つければモナドとモノイドみたいな関係もありうるんかな?

あとは、カン拡張、随伴、普遍性(極限だっけ?) どれかから相互に変換出来るだっけ?みたいなもん?

どちらにしろ、定義の話で面白みは無いとは思うのだが

531 名前:デフォルトの名無しさん mailto:sage [2020/09/17(木) 10:32:26.07 ID:2a8IoKJu.net]
見つけた

https://qiita.com/Guvalif/items/7f893d9a078e03c9e425

このサイトの人がまとめたpdfに書いてある
とは言ってもやはりclosed categoryは仮定してる
やっぱりapplicativeはmonadと違って“内部ホム”を持たない圏では定義できないんだろな
“内部ホム”もつ圏でmonoidal functorに<*>を定義するのはわりと簡単だけど↓
F(X) × F(Y^X)
→F(X×Y^X) (coherence)
→F(Y) (F(eval))
https://en.m.wikipedia.org/wiki/Monoidal_functor
pureが全然できんなぁと思ってたら“strong”という条件からpureが作れるんだな
まぁHaskellて圏の話するときはHASKて言えればいいんだからコレでわかったことにしよ



532 名前:デフォルトの名無しさん [2020/09/28(月) 01:41:48.03 ID:0EuZ+v5t.net]
[Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)
の小さい例題の[html](https://pastebin.com/yxSRyg2u)をアップした。
async/awaitはPromiseのお助け文法になっているが、それは扱っていない。実行環境は、
[RStudio](https://rstudio.com/products/rstudio/)から
[Node.js](https://nodejs.org/ja/)を呼び出している。

533 名前:デフォルトの名無しさん [2020/10/12(月) 16:08:54.17 ID:Wx/lfAmjI]
挑戦する馬鹿として生きるか?批判だけする雑魚として死ぬか?
https://www.youtube.com/watch?v=4jlQlo1oC3E
奴隷職に就く★自ら奴隷を選んで不満を言う愚かさ
https://www.youtube.com/watch?v=loD5ukKsZOk
バカは騙され最低賃金でコキ使われる★物価とか関係なし
https://www.youtube.com/watch?v=sQMrMfqdgrQ
勉強しないから奴隷人生★実業と人を残す人生哲学
https://www.youtube.com/watch?v=on2gURXi4Ks
正社員特権が「ブラック社員」を生む★正社員は訴え放題
https://www.youtube.com/watch?v=lSW1vc8-qMg
「で、年収は?」と聞くバカとは合わない社長業
https://www.youtube.com/watch?v=nEELEUhBLDk

534 名前:デフォルトの名無しさん mailto:sage [2020/10/14(水) 04:31:41.26 ID:+VLXbnA3.net]
>>20
ワードカウントのロジックが不思議ちゃんだと思ったけどワードと空白の関係が
"abc dd "みたいな行儀が良い書式じゃないとだめなんだな
" "一文字スペースでワード数が1になってしまうみたいな
countFile :: String -> (Int, Int, Int)
countFile s =
let (cs, ws, ls, _) = foldl' go (0, 0, 0, False) s
in (cs, ws, ls)
where
go :: (Int, Int, Int, Bool) -> Char -> (Int, Int, Int, Bool)
go (cs, ws, ls, wasSpace) c =
let addLine | c == '\n' = 1
| otherwise = 0
addWord | wasSpace = 0
| isSpace c = 1
| otherwise = 0
in (cs + 1, ws + addWord, ls + addLine, isSpace c)

535 名前:デフォルトの名無しさん [2020/10/31(土) 09:11:59.11 ID:UJYxitvT.net]
walk.northcol.org/haskell/adts/
>代数的データ型(algebraic data type)とは,図のように木構造で表現される値からなるデータ型のことです.

必ず木構造に限定されるんだろうか?
OOPではオブジェクトグラフがありネットワークになりうるが、
Haskellでは絶対に木と考えて良いの?

536 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 12:29:50.75 ID:cEs7BAmA.net]
いいんじゃない?
型の全体は文脈自由文法で規定されるクラスだから木になる希ガス

537 名前:デフォルトの名無しさん [2020/10/31(土) 12:34:33.57 ID:fxcwqRC2.net]
この木なんの木きのこる木

538 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 12:37:07.03 ID:CAmth+XY.net]
見たこともない木ですから
独自実装のバグが出るでしょう

539 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 13:17:41.17 ID:cEs7BAmA.net]
でもよくよく考えたらHaskellのデータ型って「展開できる表現がひとつもないデータ型」もありうるんだな
無限の木になる

data InfiniteSequence = IS {car :: Int, cdr :: InfiniteSequence}

arithSeq a d = IS a $ arithSeq (a+d) d

term 0 (IS x y) = x
term n (IS x y) = term (n-1) y

main = print $ term 10 $ arithSeq 5 3
----
53

540 名前:デフォルトの名無しさん [2020/10/31(土) 13:26:01.44 ID:UJYxitvT.net]
再帰的なデータ型はグラフにできるのでは?

541 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 13:37:30.03 ID:B0ELcd4k.net]
最終的に暴走しないで展開が停止するものだけをデータ型と呼ぶならそうだけど、iterate (+4) 5 ですら無限の木になってしまう



542 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 21:13:27.13 ID:3k5Im+3l.net]
haskellの配列は代数的データ型でばないのか?

543 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 22:07:18.29 ID:XiPKdEPZ.net]
foldrなどの引数のことを代数的と言っていたような気がする
引数は(:)と[]でもいいし
(+)と0でもいい

引数を渡すと関数 [a] -> b が返ってくるが
これは関数というよりOOPの継承関係のような印象

544 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 22:34:53.43 ID:B0ELcd4k.net]
Haskell のデータ型は再帰を許すからな
どうしても「終端記号(大文字から始まるData constructet) を木構造に並べたもの」という説明をしたいなら無限グラフを使わざるをえない

545 名前:デフォルトの名無しさん [2020/11/01(日) 07:14:51.56 ID:fIYIMdhR.net]
walk.northcol.org/haskell/lists/#_%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E7%95%B3%E8%BE%BC%E3%81%BF

1)foldr (+) 0 [1, 2, 3]
(+)とカッコがつく理由は?

2)map' f = foldr (\x a -> f x : a) []
xは[]の各要素?aは何?

546 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 08:58:44.92 ID:Srz4hpJo.net]
1)
walk.northcol.org/haskell/operators/#_%E4%B8%AD%E7%BD%AE%E3%81%A8%E5%89%8D%E7%BD%AE%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88

2)
このままだと対応する値が存在しないので、少し書き換える
map' f xs = foldr (\x a -> f x : a) [] xs
xはxsの各要素、aは最後の要素では[]で、
それ以前は後ろの要素に(\x a -> f x : a)を適用した結果

547 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 09:15:58.91 ID:v6ASK7zT.net]
>>539
>
> 1)foldr (+) 0 [1, 2, 3]
> (+)とカッコがつく理由は?

+ がないと+は中置演算子で
(foldr + 0) [1, 2, 3]
になる
(+)があると普通の関数としてfoldrの因数として解釈される

> 2)map' f = foldr (\x a -> f x : a) []
> xは[]の各要素?aは何?

[]はfoldrの第3因数と同じ型の空集合
a は無名函数(\x a -> f x : a)の第2因数
定義に従ってmap' sin [] [5,6]] はわかりやすく(\x a -> sin x : a)を中置演算子++++で書くと(すなわちx ++++ a = (sin x) : aとすると)

map' sin [] [5,6]
= 5 ++++ ( 6 ++++ [] )
= 5 ++++ ( (sin 6) : [] )
= 5 ++++ [ (sin 6) ]
= [ (sin 5) : [ (sin 6) ]
= [ (sin 5) , (sin 6) ]

となる

548 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:14:49.54 ID:1eMkmBeN.net]
因数?引数ではなく?
Haskell用語なのかな

549 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:21:30.53 ID:Srz4hpJo.net]
1)
foldr + 0 [1,2,3]
と書いた場合、「+」より関数適用のほうが優先順位が高いので、
foldr + (0 [1,2,3])
と解釈される。
つまり、0という関数を[1,2,3]という引数に適用したものと、foldrを足し算するという意味となる

2)
具体例
map' f [1,2,3] = foldr (\x a -> f x : a) [1,2,3]
3番目の値
(\x a -> f x : a) 3 [] = f 3 : [] = [f 3]
2番目の値
(\x a -> f x : a) 2 [f 3] = f 2 : [f 3] = [f 2, f 3]
1番目の値
(\x a -> f x : a) 1 [f 2, f 3] = f 1 : [f 2, f 3] = [f 1, f 2, f 3]

550 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:25:40.23 ID:Srz4hpJo.net]
おっと、具体例の「foldr (\x a -> f x : a) [1,2,3]」は
「foldr (\x a -> f x : a) [] [1,2,3]」の誤り

551 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:36:13.55 ID:B/d//mYI.net]
い・・・引数



552 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:54:46.55 ID:z/eHKN3/.net]
引数です
orz
普段“因数”の方が使う人なのでうっかりしたorz

553 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:03:53.67 ID:93fSMn/e.net]
こ・・・因数

554 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:05:28.12 ID:z/eHKN3/.net]
こ?

555 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:11:25.51 ID:4+fLUvoM.net]
だ…因数

556 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 12:57:34.37 ID:9/8GaKcH.net]
ひきすう

557 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 15:22:11.82 ID:N8AW169o.net]
引数を「ひきすう」と読むのは、同音異義語との混同を避けるための慣用読みだと思ってた
化学(ばけがく)、鼻腔(びくう)みたいな

558 名前:デフォルトの名無しさん [2020/11/01(日) 15:24:45.41 ID:BdB3gM+x.net]
返り血

559 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:34:03.38 ID:S9fsJ+JS.net]
Parameterとargumentsの違いがよくわからない

560 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:44:50.76 ID:5aO2zs3I.net]
https://qiita.com/yuba/items/141bdb2df407ee37417f

だってよ

561 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:59:46.68 ID:S9fsJ+JS.net]
よくわからんし一緒ってことか



562 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 00:43:34.64 ID:TnMF05Pn.net]
質問です
このサイトでNum instanceをDerivingする話が出てました

https://qiita.com/HirotoShioi/items/8a6107434337b30ce457

実際このページの次のコードはうちの環境でも通ります
Haskell Online Compiler [ghc-8.4.4]
Copyright (c) The University of Glasgow

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype Quantity = Quantity Int
deriving (Eq, Ord, Num, Show)

a = Quantity 2
b = Quantity 6

totalQuantity :: Quantity
totalQuantity = a + b
-- Quantity 8

しかし次は通りません
通す事はできますか?

import Text.ParserCombinators.Parsec
import Text.Parsec (Parsec)

newtype ParserInt = PI (Parser Int) deriving (Num)

563 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 00:43:43.72 ID:TnMF05Pn.net]
---- エラーメッセージ
Haskell Online Compiler [ghc-8.4.4]
Copyright (c) The University of Glasgow

Compiling your program...

[1 of 1] Compiling Main ( prog.hs, prog.o )

prog.hs:6:47: error:
• No instance for (Num (Parser Int))
arising from the 'deriving' clause of a data type declaration
Possible fix:
use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
• When deriving the instance for (Num ParserInt)
|
6 | newtype ParserInt = PI (Parser Int) deriving (Num)
| ^^^

564 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 21:44:04.17 ID:aBc5dqas.net]
こうすりゃ無理やり通すことはできるけど、
そもそもパーサ同士の足し算等々でどう動いて欲しいのか分からんから
まともなインスタンス宣言が書けん

{-# LANGUAGE FlexibleInstances #-}
instance Num (Parser Int) where
 x + y = x
 x * y = x
 abs x = x
 signum x = x
 negate x = x
 fromInteger n = return 0

565 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 23:56:16.57 ID:Zq9JUsOb.net]
>>558
元は別スレに出てた問題で
「与えられた文字列の中で“trickと"treat”どっちが先に出てくるか判定せよ」
なんです
とりあえずparserを与える関数として
makeP = mconcat . map ( manyTill anyChar . char )
でできました
コレを例えば"abc"にapplyするとmtl = manyTill、ac=anyCharとして
(mtl ac $ char 'a') <> (mtl ac $ char 'b') <> (mtl ac $ char 'c'>
というparserになりコレにhiajklbcnという文字列をparseするとhijklとabcが出現するするまでに読み飛ばした文字列を返してくれます
それでお題の答えとしてparseの結果を
lastInd x s = case ( runParser ( makeP x ) () "" s ) of
Left _ -> ( [ 2, 0 ] , x )
Right y -> ( [ 0, length $ x ++ y ], x )
のようにしてlengthで数えたんです
しかしちょっと冗長なかんじがします
そもそも読み飛ばした文字列なんか欲しいわけではなく読み飛ばした文字数が欲しいだけだからほんとは
Parser String 型ではなく例えば
length <$> ( manyTill anyChar ( char 'x')
とかのParser Intで十分です
問題はコレをどうやって繋げて総和を返すコンビネータを作ろうかというところなんです
Parser Stringはmonoid型を持ってるのでmconcat一発で繋げられるんですがParser IntはNum持ってないのでsum一発で繋げるというわけにはいかないんです
なんとかできないかと探してみるとなんか「Numをderivingする」という記事を見つけて、お、コレでいけないかと色々やってみたんですがやはりParser Intにderiving一髪でNum入れる方法見つからなくてなんとかならんもんかと

566 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 01:59:40.73 ID:WdkpFDBO.net]
わざわざNumのインスタンスにしなくても、これでいいのでは
makeP = fmap sum . mapM ( fmap length . manyTill anyChar . char )

567 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 10:26:04.44 ID:qaG2IpUi.net]
>>560
うん、まぁ別にNumのインスタンス入れなくてもこの問題の話だけならいくらでも方法はあると思うんだけど、そもそもモナドってもこういう時のためにあるんじゃないのかなと思って
例えば(+)なら Num a,Functor f のとき Num (f a)は自然には導出できない、なぜなら fmap (+) は f a -> f ( a - > a ) になってしまう
しかし Applicative f なら lifaA2 (+) がピッタリ f a -> f a -> f a になって自然にキレイに Num (f a) が導出できる
だからすごく理論的には自然なのに方法がないのは何故なんだろうと
というかderiving (...) の (...) にかけるやつとダメなやつの基準がわからない
実用本位でよく使うやつだけ用意されてるに過ぎないのかな?

568 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 11:32:34.46 ID:WdkpFDBO.net]
一応、Num (f a)は導出できるけど、それで定義した(+)だと
交換則(x + y = y + x)が成り立つ保証がないからじゃないかねぇ
(パーサの順番を入れ替えた場合を考えるとわかりやすい)

{-# LANGUAGE FlexibleInstances #-}
instance (Num a, Applicative f) => Num (f a) where
 x + y = (+) <$> x <*> y
 x * y = (*) <$> x <*> y
 abs x = abs <$> x
 signum x = signum <$> x
 negate x = negate <$> x
 fromInteger n = pure $ fromInteger n

569 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 11:50:57.17 ID:hn8kPJNe.net]
>>562
なるほど、文法的に通っても意味的に文法には出てこない"Num rule"が補償されないからダメって事なのかな?
まぁ今はclassのメンバ関数の自分が利用するやつだけ定義する必要無くなったみたいだから手で書いてもいいんだけど、>>556の例だと

newtype Eval a = Eval (ReaderT Env (ExceptT String Identity) a)
deriving (Functor, Applicative, Monad, MonadReader Env, MonadError String)

とかはmonad translater越しにできるし

newtype Quantity = Quantity Int
deriving (Eq, Ord, Num, Show)

もできるのになんで Parser (Int) はあかんねんと
なんかプラクマつけたらいけんもんかと
Num くらいならいいけど Floating とかだと惨劇になってしまう

570 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 18:12:46.66 ID:oSP8TPsC.net]
この話の面白いところは
Parser Intという型を宣言する言語と
そもそも型を宣言しない言語
どっちが生産性高いかってことだよ

571 名前:!id:ignore mailto:sage [2020/11/06(金) 20:16:57.19 ID:uZSEyxFl.net]
stackくんさぁ、コンパイラのダウンロードが200MB強あるんだから、低速回線は途中で切断されるとかよくありそうなことじゃん
サスペンド・レジューム機能搭載は必須じゃないのかね
きょうびyoutube-dlでさえ向こうに切断Forbiddenされても今までダウンロードした分は残ってて、再度ダウンロードを開始した際には途中から残りの部分をダウンロードすように始まるってのにさ
仮に205.86 MiB / 205.87 MiBまで来て切断された場合
リトライすると0 MiB / 205.87 MiB からだなんてお互い不幸になると思わないのか?
こっちは成功するまで永遠に繰り返すんだぞ? むしろそっちの方がそちらにとっても迷惑じゃん
それとも低速回線は死ねっていう差別的思想を持っているのかね?



572 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 11:31:57.94 ID:Bx8aZf2L.net]
一方TeXはisoイメージを使った

573 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 13:05:47.79 .net]
パターンガードの変数の束縛は局所的なのですが、全ての場合で共通して使用してほしい束縛はどうやりますか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<342KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef