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

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

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

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

477デフォルトの名無しさん2018/01/11(木) 11:20:18.33ID:OitKCfql
欠陥のない言語があるならぜひ知りたいなあ

478デフォルトの名無しさん2018/01/11(木) 11:34:32.09ID:yR+nWLrx
クラスより構造体
メソッドよりフィールドが必要という常識を取り戻すだけで十年単位の時間がかかる

479デフォルトの名無しさん2018/01/11(木) 16:22:14.98ID:I4QPsg6T
>>476

480デフォルトの名無しさん2018/01/11(木) 16:32:20.02ID:+cHMvoU8
haskellでできることは他の言語だと難しくて
他の言語だと簡単なことはhaskellだと難しいという

481デフォルトの名無しさん2018/01/11(木) 23:26:54.83ID:CSSFSU7v
>>480
変態言語やん

482デフォルトの名無しさん2018/01/11(木) 23:57:27.46ID:kh3sTkz1
それ、褒め言葉やで

483デフォルトの名無しさん2018/01/12(金) 01:48:25.78ID:GmCW/u04
スクリプト言語を許容できてHaskellをその性能から許容できないというのは理解できない感覚

484デフォルトの名無しさん2018/01/12(金) 11:48:37.84ID:xeu4OQ73
感覚ではなく統計の取り方がそうなってるんだな
シェルスクリプトなんてプログラムのコンパイル時と起動前に実行するやつだから
起動するまで何分待たされてもベンチマークには関係ないから

485デフォルトの名無しさん2018/01/14(日) 11:36:12.66ID:OihlBKK7
型推論まわりを雰囲気で使っていました。
初等的なケースではそれでも問題なかったんですけど、
OVERLAPS とか type family とか出てきてから付いていけなくなりました。

助けてください。
https://ideone.com/XQ17ms

486デフォルトの名無しさん2018/01/14(日) 23:23:09.38ID:ppap/O0M
性能からって話はないな。
主にファイルIOやネットワークIOの気軽さの問題だと思うけど。

487デフォルトの名無しさん2018/01/14(日) 23:30:08.22ID:fSoR9A9v
初心者だから適当だけどそこら辺はバンバンFFI使えばいいんじゃないのとか思ってしまう
そういうもんでもないのか

488デフォルトの名無しさん2018/01/14(日) 23:51:01.69ID:Qz3+ZXNT

489デフォルトの名無しさん2018/01/15(月) 00:04:51.86ID:bAToeOxa
Stream Fusionの御利益を受けるには、
vectorパッケージでmapとかfoldみたいなので書けるところはすべて書いていく、
という方針でおけ?

490デフォルトの名無しさん2018/01/15(月) 00:57:56.87ID:NOFCncFl
>>488 そのサイト、人いないような… とりあえずありがとうです。

491デフォルトの名無しさん2018/01/15(月) 08:59:07.15ID:Duolqkdz
>>485
本質的にはこれと同じかな
https://ideone.com/hIoLnD
undefinedは()にもなれるから失敗してるみたい?

492デフォルトの名無しさん2018/01/15(月) 18:46:49.75ID:v1U8cihy
>>485
Freer Effectsが、だいたいわかった: 11-7 OVERLAPSプラグマ - Qiita
https://qiita.com/YoshikuniJujo/items/6b57a2778b04f54cac1e#_reference-98a5024f7096c614804a

493デフォルトの名無しさん2018/01/16(火) 00:59:29.28ID:4jams3dQ
>>485
横レスですが
(Hoo b ~ HooBar)
(b ~ Bar)
これのチルダってどういう意味なんですか(当方初心者です・・・)

494デフォルトの名無しさん2018/01/19(金) 00:29:15.30ID:ZfC+YGVh
haskell普及させたい言うわりには初心者に優しくない

495デフォルトの名無しさん2018/01/19(金) 00:41:33.13ID:bqrf+XbL
どちらかというと初心者から中級者になるまでのミッシングリンクが上手く埋められてない
H本の次のレベルにふさわしいものがないと言ったほうがいいか

496デフォルトの名無しさん2018/01/19(金) 00:53:08.18ID:ZfC+YGVh
それhaskell以外の言語でもだいたいそうじゃね?

4974852018/01/19(金) 01:45:02.15ID:uCK/Ej3G
皆様ありがとうございました。勉強しました。

型推論の全体を概観する為に、以下の記事がわかりやすかったです。
http://yu-i9.hatenablog.com/entry/thih
https://goo.gl/MH2cCx
型推論は、ざっくり 単一化 -> 帰結 の順に行われ、前者が頭部の具体化、後者は制約のチェックの役割になっているようです。

今回のケースで出たどのコードも単一化は通ってるんだけど、帰結の処理の際にエラーが出ていると思います。
>> 491 さんが単純化してくれたケースは、ご指摘の通り undefined がどちらのインスタンスにもなりうるため、"あいまいだ"という旨のエラーが出ていました。
これは例えば OVERLAPPING を INCOHERENT に置き換えると通ります。テキトウな順になるということです(OVERLAPSの解説は頂いた重城サンの記事(>> 492)が参考になりました)。

4984852018/01/19(金) 01:45:29.89ID:uCK/Ej3G
元の >> 485 のコードは型の属(type families)と等式制約が絡んだものです。
hoo :: ( 型制約 ) => 頭部
型制約中に現れるチルダは等式制約と呼ばれていて、これは type families が導入されたときに追加された文法らしい(>> 493)。
ざっくり言うと、Hoo b ~ HooBar は「型の関数 Hoo に型 b を適用したものが型 HooBar と等しくなる、という制約」を頭部に課します。
詳しくは http://www.kotha.net/ghcguide_ja/7.6.2/equality-constraints.html

俺がコンパイラに期待したのは、 f :: (Hoo b ~ HooBar) => b の型シグニチャによって、b ~ Bar を類推することだったんですけど、どうもそれがうまく行っていない。
結局、帰結処理で type family や等式制約がどのように処理されるのかの資料は見つからなかったのですが、失敗する理由はわかりました。
この記事に答えがありました。 https://qiita.com/lotz/items/6c038698c8f04f57113a
type instance Hoo Bar = HooBar だけでは、それ以外のインスタンス、例えば Hoo () などが HooBar とおなじになる可能性を排せないので、b を一意に決定することができないらしいんです。
型関数が単射であることをコンパイラに伝えれば解決です。言語拡張TypeFamilyDependencies を加え、
- type family Hoo b :: *
+ type family Hoo b = r | r -> b
と書き換えると、>> 485 のプログラムはコンパイルを通ります。

499デフォルトの名無しさん2018/01/19(金) 07:41:26.43ID:qWabwUd0
>>495
リスト本読め

500デフォルトの名無しさん2018/01/19(金) 15:11:02.24ID:uCK/Ej3G
>>450
stack で指定したターゲット以外の余計なものがビルドされてしまう問題は、バグの可能性があります。
https://github.com/commercialhaskell/stack/issues/1406

501デフォルトの名無しさん2018/01/20(土) 08:32:17.48ID:lXdHdJ+E
Haskellの型コンストラクタがいまいち理解できなかったけど、ラムダキューブでやっと理解できた。
ポリモーフィックな関数と所謂依存型とセットなんだね。

型コンストラクタとそいつで作られる型がオーバーロードできるのは、紛らわしい気がする。

502デフォルトの名無しさん2018/01/20(土) 09:37:30.01ID:/5XEeDZf
>>494
何となく学習じゃあ、解決したい問題領域が曖昧なままだからな、何やっても難しく感じるよ。

503デフォルトの名無しさん2018/01/20(土) 16:49:26.40ID:I7uywYWL
もし依存型があったらリストの長さにより異なる型を使うね
でも遅延評価はリストの長さが有限でも無限でも同じ型にする
相性悪そう

5044932018/01/20(土) 18:46:54.97ID:oxqYKpr1
>>498
ありがとうございます

505デフォルトの名無しさん2018/01/24(水) 05:27:57.73ID:/4CMqd4L
hieとVSCode使ってるんだが、ドキュメントや入力候補が「読み込んでます」ってなって一向に読み込まれないんだが
お前らは問題なく使えてるの?っていうかどんな環境でやってる?

506デフォルトの名無しさん2018/01/24(水) 06:36:24.95ID:EfrrCAID

507デフォルトの名無しさん2018/01/24(水) 18:54:42.65ID:A4/TKZVr
csacademyってコード貼り付けサイトして定着してんの?

508デフォルトの名無しさん2018/01/27(土) 12:07:53.22ID:3P02pcTc
Haskellの良いところは宣言的であることです。
宣言的であるということはCSSのように素人には使いこなせないということです。
素人には使いこなせなくすることでウェブデザイナーという奇妙な職業が生まれました。
同様にHaskellもハスケラーという新たな職業を生み出す可能性があります。

509デフォルトの名無しさん2018/01/27(土) 17:18:06.19ID:Y4G+sRnH
コードの質の下限が他の言語より高いなとは思う
例えばPHPなんかは、プログラマの能力によって質の良し悪しのギャップが非常に大きい
それに対してHaskellは、上を見たらキリがないが、下を見てもコンパイルエラーを起こさない時点である程度の質が担保されてる
その分覚えることが多いし、短期的な開発効率も下がりそうだけど、長い目で改修や保守を考えると悪くなさそう

510デフォルトの名無しさん2018/01/27(土) 17:19:06.86ID:Y4G+sRnH
>>509
PHPと比べてもしょうがないな…Javaあたりに読み替えといてください

511デフォルトの名無しさん2018/01/27(土) 19:16:11.49ID:S0om7f3c
> コードの質の下限が他の言語より高いなとは思う

>>133

512デフォルトの名無しさん2018/01/31(水) 04:05:44.40ID:hDoqvddW
入門書
入門書
入門書
 :
Haskell 中級書出して

513デフォルトの名無しさん2018/01/31(水) 04:10:45.92ID:hCnyArbk
Effective Haskell ください

514デフォルトの名無しさん2018/01/31(水) 07:45:42.81ID:jydCvtlX
Haskell Wikibooksとか中上級くらいでないの?

515デフォルトの名無しさん2018/01/31(水) 18:11:04.78ID:F9QE8ZcE
「プログラミングHaskell」(Graham Hutton (著),‎ 山本 和彦 (翻訳))
って入門者向け?

516デフォルトの名無しさん2018/01/31(水) 18:19:54.71ID:6Wa3kgEE
>>515
入門者向けには難しい
入門書を読み終えた初心者には物足りない
そんな本

517デフォルトの名無しさん2018/02/01(木) 08:00:02.87ID:Xuh9WGFR
ghci で
> let x :: (a ~ Int) => a;x = undefined
として実際の型をみると
> :t x
x :: Int
に変わっている。これはどういう仕組みによるもの?

518デフォルトの名無しさん2018/02/02(金) 14:28:38.64ID:iEY/rJwQ
引数が Show a だったらTrue, 違ったら False を返す関数
isShow :: a -> Bool
は可能ですか?

519デフォルトの名無しさん2018/02/02(金) 20:19:41.59ID:NSR+boPa
Haskell外部ライブラリの型をShowクラスのインスタンスにしてデバッグを楽にする
http://blog.kzfmix.com/entry/1349904819

本物のプログラマはHaskellを使う - 第15回 Haskellでのデバッグのコツをつかむ:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20071204/288630/

型に対して後から型クラスのインスタンス宣言を自動導出するには - Qiita
https://qiita.com/hyone/items/a47b905936e55147fe59

520デフォルトの名無しさん2018/02/02(金) 20:45:14.24ID:PIo4kucW
https://wiki.haskell.org/GHC/AdvancedOverlap
これは自前でインスタンスの一覧作ってる

521デフォルトの名無しさん2018/02/03(土) 00:14:03.29ID:st4XedSX

5225182018/02/03(土) 00:59:05.30ID:z/YnSxMM
AdvancedOverlapは外でShowのインスタンスが増えた時に対応できないです。
isInstanceOf ! そういうのがあるんですか。調べてみます。

これを通して実現したい機能は、頭部ではなく型制約でオーバーロードしたいというもの。
具体的にはdiagramsパッケージの元で作ったダイアグラムを画像化したい。
同じ関数で Show a も画像化したい。
一見簡単そうなんですけど、普通に合成したダイアグラムの頭部に具体的な型がつかないので、
通常の型クラスのインスタンス化でオーバーロードできない。
instance Show a => Hoo a where ...
instance (a ~ Diagram B) => Hoo a where ...
-- コンパイルエラー!

523デフォルトの名無しさん2018/02/03(土) 22:01:25.34ID:GVlapN64
すみません、
Huttonの「プログラミングHaskell」で
学習をしているのですが
練習問題の解答が
著者や役者のサイト等を見ても見当たらなく
もし掲載のページを知ってたら教えて下さい。

524デフォルトの名無しさん2018/02/04(日) 04:24:30.53ID:fRCSu2fr
プログラミングHaskell 訳者によるサポートページ
http://www.mew.org/~kazu/doc/book/haskell.html
> 練習問題の答は、原著者のサポートページにあります。

5255232018/02/04(日) 12:22:57.81ID:VtcsF5YK
>>524
すみません。
原著者のサポートページでは回答例を見つける事ができませんでした。
翻訳されていないの新版には回答例が掲載されているようですね。

526デフォルトの名無しさん2018/02/04(日) 14:14:55.60ID:+WAJGnPT
コード例とかならここにあるみたいだけど
http://www.cs.nott.ac.uk/~pszgmh/book-old.html

527デフォルトの名無しさん2018/02/04(日) 19:26:34.09ID:VtcsF5YK
>>524 >>526

ありがとうございます。
学習の参考にさせて頂きます。

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