関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/ それ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
は可能ですか? AdvancedOverlapは外でShowのインスタンスが増えた時に対応できないです。
isInstanceOf ! そういうのがあるんですか。調べてみます。
これを通して実現したい機能は、頭部ではなく型制約でオーバーロードしたいというもの。
具体的にはdiagramsパッケージの元で作ったダイアグラムを画像化したい。
同じ関数で Show a も画像化したい。
一見簡単そうなんですけど、普通に合成したダイアグラムの頭部に具体的な型がつかないので、
通常の型クラスのインスタンス化でオーバーロードできない。
instance Show a => Hoo a where ...
instance (a ~ Diagram B) => Hoo a where ...
-- コンパイルエラー! すみません、
Huttonの「プログラミングHaskell」で
学習をしているのですが
練習問題の解答が
著者や役者のサイト等を見ても見当たらなく
もし掲載のページを知ってたら教えて下さい。 プログラミングHaskell 訳者によるサポートページ
http://www.mew.org/~kazu/doc/book/haskell.html
> 練習問題の答は、原著者のサポートページにあります。 >>524
すみません。
原著者のサポートページでは回答例を見つける事ができませんでした。
翻訳されていないの新版には回答例が掲載されているようですね。 コード例とかならここにあるみたいだけど
http://www.cs.nott.ac.uk/~pszgmh/book-old.html >>524 >>526
ありがとうございます。
学習の参考にさせて頂きます。 class Hoo a
x :: Hoo a => a -> a
y :: (Hoo a => a) -> a
x = undefined
y = undefined
-- f :: a -> a
-- f a = x a -- コンパイル通らない
g :: a -> a
g a = y a -- コンパイル通る。なんでだ
-- h = y :: a -> a -- 通らない ghcを8.0.2 から 8.2.2に上げた。
h = y :: a -> a -- 通るようになった emacsでSymbols function definition is void: haskell-debug
てエラー文が出ちゃうんですが、原因わかる人いませんか、、
正確にはspacemacsのinteroです、、 tanakhがイキリー田中って呼ばれているみたいだけどイキリーってどういう意味?
550番組の途中ですがアフィサイトへの転載は禁止です (ワンミングク MMda-oDZj)2018/03/11(日) 22:51:59.49ID:2Wu75Uw+M
pezyスパコン社員の
イキリー田中さん曰わく
Hideyuki Tanaka
@tanakh
最近ずっと国会で、国会じゃなくて裁判所でやるようなことばっかりやってないすか。もう逆に裁判所で政策議論した方が三権分立的にいいんじゃないすか(適当)
午前0:06 · 2018年3月10日
https://twitter.com/tanakh/status/972126503352676352 売上データを証拠として提出する発想が裁判所だな
裁判の真似事をやってるのは統計学者だ モナドの中での条件分岐ってはどうやればいいでしょうか
m0 >>= m1 arg1 【 >>= m2 arg2 】 >>= mN argN
【 】のブロックを条件に応じて呼び出すかどうかを制御したいです
whenだと値が取り出せない 遅延評価って面白いね
ぱっと見挙動がわかりにくいのと使い所がみつけづらいのが難点だけど purescriptをめっちゃ強化してクロスコンパイル&ネイティブコンパイル&jsコンパイル&wasmコンパイル可能でさらにビルド速度とGC性能をocaml並に出来ませんか😱 もし自作の型が Generic クラスのインスタンスなら、
その型を Num クラスのインスタンスにするのは容易でボイラープレートを書くだけだ、
という話を聞いたのですが、どういうことでしょうか。 Genericは代数的データ型の代数的構造に対して型クラスを使えるようにする仕組みという感じだから
例えば自然数の型クラスがあったらdata Nat = Zero | Succ Natっぽい型をインスタンスにできる(ようにできる)
data List a = Nil | Cons (List a)とかもList a=Natでいけそうだけど詳しいことは知らない
でNumは整数の型クラスだから符号情報を持たせた自然数っぽい型で考えればいいと思う FRPのBehaviorとEventの構成ってなんか恣意的なのかなって印象で手付かずだったけど、
型がそれぞれ関数と直積で、カリーハワード考えるとForAllとExistsですよて説明見たら、
何に効いてくるのかまだよく分からんけど、真面目にやろうかなと思った。 Yesod のオライリー本ってまだ翻訳されてないの print "日本語"
で日本語を表示するにはどうしたらいいですか? 公開したくない自作データ型を引数に持つ自作関数をhspecでテストする方法を探しています。
自作のモジュールは2つあり、ひとつはテストしたい関数 g がある ModSub、もうひとつは ModSub を使用する ModMain です。
-----[ ModMain.hs ]-----
module ModMain where
import ExtLib (calc) -- 外部ライブラリ
import ModSub
f = calc g 他のいくつかの引数 -- 他にも関数を呼び複雑な計算をする
-----[ ModSub.hs ]-----
module ModSub (g) where
import Control.Applicative
import ExtLib (SomethingClass) -- 外部ライブラリ
data D = D Bool Int
instance SomethingClass D where
someFunc = pure D <*> makeBool 適当 <*> makeInt 適当
g (D b i) = 何か
ExtLib の calc 関数は Something クラスのインスタンス型を引数に持つ関数を取り、その具体的な型は知る必要がありません。
私はアプリケーションの作成に当たって公開しなても動く設計のものは公開しないスタンスです。
なので、ModSub モジュールは D 型のコンストラクタを公開していません。
このような状況ではテストモジュールからも D 型が使えずテストできないため、私は2つの選択肢を考えました。
ひとつは、諦めてスタンスを曲げて D 型のコンストラクタを公開する。
もうひとつは、D 型を別のモジュール InnerModSub 内に定義して公開し、ModSub モジュールとテストモジュールは InnerModSub モジュールを使う。
そして、ModMain モジュールや他のモジュールは決して InnerModSub モジュールを使わないようルールを設ける。
他に何か良い方法はあるでしょうか。 >>554
アドバイスありがとうございます。
その方法でやっても、さらに、そのモジュールを exposed-midules に置くかどうかの選択肢があるのですね。
検討してみます。 ようやくwin10 wslでghcが遅かった件直った感じかな モナまでは可愛いが、油断してるとドがついて怖い感じ。 Reflexやってる人います?Stackと親和的じゃないから結局諦めちゃった。
Threepenny-GUIはシンプルで良いね。Threepennyで作ったのをiOSやAndroidに移植できるんかな。 intellijにhaskellいれようとしてたらいくらやってもだめだったの
よーくみたらWindow Defenderがじゃましてた
はらたつー random パッケージの System.Random モジュールの split 関数は、
新しい RandomGen クラスのインスタンスをなぜ2つも生成するのでしょうか。
2つのインスタンスが要るのなら、引数の1つ目があるのだから、
新たに生成するのも1つで十分だと思うのです。
もっと必要なら、この処理を繰り返せばいいのでは?
私は何か勘違いをしているのでしょうか。 そもそもnextだってgetValとnextGenに分けてもいいけどね
まあ基本的には設計とか効率の問題なんじゃない?
それに戻り値が一つのsplitは引数の方がそのままもう一回splitされないように注意する必要があるし 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
P0GWF エスパー来る
ところで、関数型言語のこの世の春は来ますか? GHCのインストール先の変え方教えて
ちなWindows
Cドライブに入れたくない haskellの練習してる初心者なんですが2進数の文字列表現を10進数の整数に変換する処理ってこんな感じで大丈夫でしょうか? https://csacademy.com/code/CsGalG5X/ 単に数値にしてるだけであって、10進数に変換して表示してるのはprintさんでしょ? Showが忖度したのであってInteger大臣が文字列化を指示したわけではない どうでもいいけど、それぞれのGHC言語拡張の名前で単数形と複数形の違いがいまいち分からん。
うろ覚えで複数形で書いてコンパイルエラーになったり。
命名規則とかあるんかな? 使った中じゃ英語で説明するのに複数形が使われるであろうものなら
大体複数形だったと思うけど
カタカナ語のノリでやってるから割と間違う おい!あの岡部健(毛の壁)がgithubで活動を再開してるぞ! 今時コンパイルとか流行らないよ
サクッと書けても実行までが面倒だと普及しない
もっと標準ライブラリをヘビィにしてPython化するしか生き残りの道はない 同意だ。Turtle使ってシェバンにstackコマンドライン書いて、
Haskellでシェルスクリプトするというのがあったが正気の沙汰とは思えない。 むしろ今はコンパイル全盛期でしょ
rubyとか下火だし どれだけ簡潔に記述出来ても
短いプログラムでは実行するまでの手間の割合が大きくなるから
pythonでいいやってなる 対話環境使わんの?短いプログラムてのがどんな状況か知らんからなんとも。 Haskellで簡潔に書けるという特殊能力を持っておきながら
破壊的で動的型付けな言語を選ばなければいけないという悲劇 なんで宗教みたいに二者択一になるの
要所要所で使い分ければいいだけでしょ たかだか数秒のことで簡潔さを失いたいとは思わないね バンパターンとかseqとか使いまくるからあんま簡潔に書けないわ 簡単なプログラムだと
このifでこれとこれ書き換えてさらにネストしたifでこれとこれを書き換えて
とかやっちゃうな
haskellでもStateモナドとか使えばいいんだろうけど 文字列を直接操作したければ動的型でいい
直接操作することなくShowとReadで処理できるならHaskellの型は無駄ではない 込み入った評価戦略で脳ミソ使わされるのが真理とも思えんがw ■ このスレッドは過去ログ倉庫に格納されています