関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/ プラグマとかシンタックスシュガーのオプションがやたらあって、
古い構文がデフォルトでなくなったり、いまだに安定してないイメージが強い 拡張の数は標準の安定性と関係ないし非推奨になった構文も知る限り2,3個程度しかないし言うほど安定してなくはないと思うよ
主要な拡張の破壊的変更も多ければ不安定だがそこは知らん
安定してる言語の話題たまに出るけどどの言語もそれなりに不安定という結論以外になったとこ見たことない そういや使用安定してるからで極地でCLが使われてたな >>407
アドバイスありがとうございました。
参考にします。 再帰ってわかりにくくないですか?
実際によく使われているんですか? 扱うデータ構造が再帰的なら(連結リストとか木とか)
アルゴリズムも再帰の方が自然 初見だと脳のワーキングメモリをオーバーフローして拒絶反応を示すけど
慣れたら問題先送りにしちゃって尚且つ最後には解決しちゃう魔法みたいで気持ちいいよ ループより再帰が好きだけどスタック気にしたりわざわざ末尾再帰にしなきゃいけなかったりするのは割とめんどい breakとcontinueとreturnとthrowは関数ではない
関数ではないものを見るとマクロを書きたがるのがLisp
Haskellはマクロを使わない技術が発達したからなんでも関数を使う HaskellはCのプリプロセッサ(俗に言うマクロ)を使えるのでは エラーの原因を教えてほしいという奴にエラーの原因を教えないのがHaskellerか
また同様のエラーが出てもこのスレにくればコード書き直してやるよっていう優しさか Windows10でstackのプロジェクトをbuildするとエラーが出てビルド出来ないお(´・ω・`)
While building custom Setup.hs for package ........
..
..
..
Process exited with code: ExitFailure 1 ボウヤは『windows10 haskell stack build error』でググるとかはしたのかい? 飢える者に魚を与えても一日しか救えない
釣りを教えれば一生救えるやもしれぬ
してみれば、>>435は魚を与えたのじゃ >>434
>>435
条件ミスってて全部otherwiseに行ってたのも直したらちゃんと動きました
ありがとうございます >>438
Windowsで動かないパッケージ使ってるとか? >>428
好き嫌いというか、ループはループ中で変数を操作するから値を返せるのであって、変数を言語から排除すれば自然にループも排除されるんじゃないの?
ループがあっても再帰が不要にはならない。でも再帰があればループ不要は本当の話。だからこそ変数を排除した言語があるんでしょ。 >>438 の原因はプロジェクトのパスに日本語が含まれているからでした...orz >>447
toBarの仕事はもっと少なくした方がいいよー
ソートとかは既存関数で手抜きしたけど、参考までに
https://ideone.com/fGFOEl stack の使い方について質問です。
stack new で作ったプロジェクトの package.yaml に executables と tests が設定されています。
その上で、tests のみのビルドあるいはビルド&実行を行うという事をしたいです。
しかしうまく行きません。
余計なものまでビルドされたり、実行されたりします。
executables には cmd-exe というターゲットがひとつ、tests には cmd-test というターゲットがひとつあるとします。
まず cmd-test のビルドだけを行いたく、stack build :cmd-test コマンドを実行してみました。
すると、cmd-exe と cmd-test がビルドされ、かつ cmd-test が実行されてしまいました。
今度は cmd-test のビルドと実行を行いたく、stack test :cmd-test コマンドを実行してみました。
すると、こちらも cmd-exe も一緒にビルドされてしまいました。
cmd-exe をビルドしないで cmd-test のみをビルドする方法、
そして cmd-test を実行しないでビルドのみを行う方法はあるでしょうか。 >>450
実行しないでビルドだけ行うのは --no-run-tests オプションを付けることで実現できましたが、
それでもまだ cmd-exe の方も同時にビルドされてしまいます。 普通の言語のできない数学者がプログラミングできるようにするための言語だ
彼らにはたやすい デフォルト遅延評価に破壊的更新超苦手とかいうパフォーマンス的には冗談みたいな存在なのに
静的型付コンパイルというだけでVMアンチ勢から謎の期待を向けられる言語Haskell この先haskellで良いGUIフレームワークって出ると思う? >>456
現行のGUIフレームワークの問題点は何でしょうか? >>459
>Haskellは遅延評価なので、リストを返す関数だからといって中間データとしてのリストを必ず作成する訳ではありませんから、
>結果を即座にfromListで書き込めば実質的に配列を出力する事が可能です。
ほんとぉ?
もう融合変換なんていらんやん まあグラフ簡約がなかったらどうなるか実験した方がいいと思う >>465
ほとんどの場合サンクを作るのは無駄だし最適化にも不利 haskellのコンパイルエラーメッセージが難解すぎる >>468
問題があるのは10行目 return (shuffle (i - 1) flipped)
これの型は実際には、IO (IO [Int]) だが期待されているのは IO [Int] だ。
IO(などのモナド) に包むために使われる return はここでは不要。外すと IO [Int] になってコンパイル通る。 >>460
> おまえらってIDE何使ってるの?
>>73 あたりで同じ質問があった。VSCode, spacemacs が人気 >>455
この話をすると決まってStrict拡張を持ち出してくるのが痛いHaskellerの特徴だな
じゃあ最初から遅延評価なんかすんじゃねえよ パフォーマンス的にはC/C++が王道だから素直にFFIを持ち出すのが王道
C/C++とFFIを無視するのは某言語の痛い特徴だよ 久々にHaskellで簡単なプログラム書いたんだけど
構造体使うだけでStateモナドもlensも必要になるあたりやっぱ欠陥言語だなこれ
最初から言語機能にいれとけや >>466
その理屈だと遅延評価しない方は更に遅いじゃん。 クラスより構造体
メソッドよりフィールドが必要という常識を取り戻すだけで十年単位の時間がかかる haskellでできることは他の言語だと難しくて
他の言語だと簡単なことはhaskellだと難しいという スクリプト言語を許容できてHaskellをその性能から許容できないというのは理解できない感覚 感覚ではなく統計の取り方がそうなってるんだな
シェルスクリプトなんてプログラムのコンパイル時と起動前に実行するやつだから
起動するまで何分待たされてもベンチマークには関係ないから 型推論まわりを雰囲気で使っていました。
初等的なケースではそれでも問題なかったんですけど、
OVERLAPS とか type family とか出てきてから付いていけなくなりました。
助けてください。
https://ideone.com/XQ17ms 性能からって話はないな。
主にファイルIOやネットワークIOの気軽さの問題だと思うけど。 初心者だから適当だけどそこら辺はバンバンFFI使えばいいんじゃないのとか思ってしまう
そういうもんでもないのか Stream Fusionの御利益を受けるには、
vectorパッケージでmapとかfoldみたいなので書けるところはすべて書いていく、
という方針でおけ? >>488 そのサイト、人いないような… とりあえずありがとうです。 >>485
本質的にはこれと同じかな
https://ideone.com/hIoLnD
undefinedは()にもなれるから失敗してるみたい? >>485
横レスですが
(Hoo b ~ HooBar)
(b ~ Bar)
これのチルダってどういう意味なんですか(当方初心者です・・・) haskell普及させたい言うわりには初心者に優しくない どちらかというと初心者から中級者になるまでのミッシングリンクが上手く埋められてない
H本の次のレベルにふさわしいものがないと言ったほうがいいか それhaskell以外の言語でもだいたいそうじゃね? 皆様ありがとうございました。勉強しました。
型推論の全体を概観する為に、以下の記事がわかりやすかったです。
http://yu-i9.hatenablog.com/entry/thih
https://goo.gl/MH2cCx
型推論は、ざっくり 単一化 -> 帰結 の順に行われ、前者が頭部の具体化、後者は制約のチェックの役割になっているようです。
今回のケースで出たどのコードも単一化は通ってるんだけど、帰結の処理の際にエラーが出ていると思います。
>> 491 さんが単純化してくれたケースは、ご指摘の通り undefined がどちらのインスタンスにもなりうるため、"あいまいだ"という旨のエラーが出ていました。
これは例えば OVERLAPPING を INCOHERENT に置き換えると通ります。テキトウな順になるということです(OVERLAPSの解説は頂いた重城サンの記事(>> 492)が参考になりました)。 元の >> 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 のプログラムはコンパイルを通ります。 Haskellの型コンストラクタがいまいち理解できなかったけど、ラムダキューブでやっと理解できた。
ポリモーフィックな関数と所謂依存型とセットなんだね。
型コンストラクタとそいつで作られる型がオーバーロードできるのは、紛らわしい気がする。 >>494
何となく学習じゃあ、解決したい問題領域が曖昧なままだからな、何やっても難しく感じるよ。 もし依存型があったらリストの長さにより異なる型を使うね
でも遅延評価はリストの長さが有限でも無限でも同じ型にする
相性悪そう hieとVSCode使ってるんだが、ドキュメントや入力候補が「読み込んでます」ってなって一向に読み込まれないんだが
お前らは問題なく使えてるの?っていうかどんな環境でやってる? csacademyってコード貼り付けサイトして定着してんの? Haskellの良いところは宣言的であることです。
宣言的であるということはCSSのように素人には使いこなせないということです。
素人には使いこなせなくすることでウェブデザイナーという奇妙な職業が生まれました。
同様にHaskellもハスケラーという新たな職業を生み出す可能性があります。 コードの質の下限が他の言語より高いなとは思う
例えばPHPなんかは、プログラマの能力によって質の良し悪しのギャップが非常に大きい
それに対してHaskellは、上を見たらキリがないが、下を見てもコンパイルエラーを起こさない時点である程度の質が担保されてる
その分覚えることが多いし、短期的な開発効率も下がりそうだけど、長い目で改修や保守を考えると悪くなさそう >>509
PHPと比べてもしょうがないな…Javaあたりに読み替えといてください > コードの質の下限が他の言語より高いなとは思う
>>133 入門書
入門書
入門書
:
Haskell 中級書出して Haskell Wikibooksとか中上級くらいでないの? 「プログラミングHaskell」(Graham Hutton (著), 山本 和彦 (翻訳))
って入門者向け? >>515
入門者向けには難しい
入門書を読み終えた初心者には物足りない
そんな本 ghci で
> let x :: (a ~ Int) => a;x = undefined
として実際の型をみると
> :t x
x :: Int
に変わっている。これはどういう仕組みによるもの? 引数が Show a だったらTrue, 違ったら False を返す関数
isShow :: a -> Bool
は可能ですか? ■ このスレッドは過去ログ倉庫に格納されています