X



関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0453デフォルトの名無しさん
垢版 |
2018/01/08(月) 14:07:49.41ID:jbPveYoe
普通の言語のできない数学者がプログラミングできるようにするための言語だ
彼らにはたやすい
0455デフォルトの名無しさん
垢版 |
2018/01/08(月) 15:59:26.22ID:eAAAEsR7
デフォルト遅延評価に破壊的更新超苦手とかいうパフォーマンス的には冗談みたいな存在なのに
静的型付コンパイルというだけでVMアンチ勢から謎の期待を向けられる言語Haskell
0461デフォルトの名無しさん
垢版 |
2018/01/09(火) 07:52:35.28ID:jdJt8oqE
>>459
>Haskellは遅延評価なので、リストを返す関数だからといって中間データとしてのリストを必ず作成する訳ではありませんから、
>結果を即座にfromListで書き込めば実質的に配列を出力する事が可能です。
ほんとぉ?
もう融合変換なんていらんやん
0465デフォルトの名無しさん
垢版 |
2018/01/09(火) 22:16:54.64ID:zX7pY+gm
>>455
遅延評価=遅いって考える理由は?
0469デフォルトの名無しさん
垢版 |
2018/01/10(水) 01:23:11.48ID:2r/l0e/u
>>468
問題があるのは10行目 return (shuffle (i - 1) flipped)
これの型は実際には、IO (IO [Int]) だが期待されているのは IO [Int] だ。
IO(などのモナド) に包むために使われる return はここでは不要。外すと IO [Int] になってコンパイル通る。
0472デフォルトの名無しさん
垢版 |
2018/01/10(水) 18:04:01.49ID:CldIXwzW
>>455
この話をすると決まってStrict拡張を持ち出してくるのが痛いHaskellerの特徴だな
じゃあ最初から遅延評価なんかすんじゃねえよ
0473デフォルトの名無しさん
垢版 |
2018/01/10(水) 20:08:59.81ID:YX2ZZ0s/
パフォーマンス的にはC/C++が王道だから素直にFFIを持ち出すのが王道
C/C++とFFIを無視するのは某言語の痛い特徴だよ
0474デフォルトの名無しさん
垢版 |
2018/01/10(水) 21:51:06.06ID:CldIXwzW
久々にHaskellで簡単なプログラム書いたんだけど
構造体使うだけでStateモナドもlensも必要になるあたりやっぱ欠陥言語だなこれ
最初から言語機能にいれとけや
0476デフォルトの名無しさん
垢版 |
2018/01/11(木) 00:40:52.51ID:vZTNKaQ4
>>466
その理屈だと遅延評価しない方は更に遅いじゃん。
0478デフォルトの名無しさん
垢版 |
2018/01/11(木) 11:34:32.09ID:yR+nWLrx
クラスより構造体
メソッドよりフィールドが必要という常識を取り戻すだけで十年単位の時間がかかる
0480デフォルトの名無しさん
垢版 |
2018/01/11(木) 16:32:20.02ID:+cHMvoU8
haskellでできることは他の言語だと難しくて
他の言語だと簡単なことはhaskellだと難しいという
0483デフォルトの名無しさん
垢版 |
2018/01/12(金) 01:48:25.78ID:GmCW/u04
スクリプト言語を許容できてHaskellをその性能から許容できないというのは理解できない感覚
0484デフォルトの名無しさん
垢版 |
2018/01/12(金) 11:48:37.84ID:xeu4OQ73
感覚ではなく統計の取り方がそうなってるんだな
シェルスクリプトなんてプログラムのコンパイル時と起動前に実行するやつだから
起動するまで何分待たされてもベンチマークには関係ないから
0485デフォルトの名無しさん
垢版 |
2018/01/14(日) 11:36:12.66ID:OihlBKK7
型推論まわりを雰囲気で使っていました。
初等的なケースではそれでも問題なかったんですけど、
OVERLAPS とか type family とか出てきてから付いていけなくなりました。

助けてください。
https://ideone.com/XQ17ms
0486デフォルトの名無しさん
垢版 |
2018/01/14(日) 23:23:09.38ID:ppap/O0M
性能からって話はないな。
主にファイルIOやネットワークIOの気軽さの問題だと思うけど。
0487デフォルトの名無しさん
垢版 |
2018/01/14(日) 23:30:08.22ID:fSoR9A9v
初心者だから適当だけどそこら辺はバンバンFFI使えばいいんじゃないのとか思ってしまう
そういうもんでもないのか
0489デフォルトの名無しさん
垢版 |
2018/01/15(月) 00:04:51.86ID:bAToeOxa
Stream Fusionの御利益を受けるには、
vectorパッケージでmapとかfoldみたいなので書けるところはすべて書いていく、
という方針でおけ?
0493デフォルトの名無しさん
垢版 |
2018/01/16(火) 00:59:29.28ID:4jams3dQ
>>485
横レスですが
(Hoo b ~ HooBar)
(b ~ Bar)
これのチルダってどういう意味なんですか(当方初心者です・・・)
0495デフォルトの名無しさん
垢版 |
2018/01/19(金) 00:41:33.13ID:bqrf+XbL
どちらかというと初心者から中級者になるまでのミッシングリンクが上手く埋められてない
H本の次のレベルにふさわしいものがないと言ったほうがいいか
0497485
垢版 |
2018/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)が参考になりました)。
0498485
垢版 |
2018/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 のプログラムはコンパイルを通ります。
0501デフォルトの名無しさん
垢版 |
2018/01/20(土) 08:32:17.48ID:lXdHdJ+E
Haskellの型コンストラクタがいまいち理解できなかったけど、ラムダキューブでやっと理解できた。
ポリモーフィックな関数と所謂依存型とセットなんだね。

型コンストラクタとそいつで作られる型がオーバーロードできるのは、紛らわしい気がする。
0502デフォルトの名無しさん
垢版 |
2018/01/20(土) 09:37:30.01ID:/5XEeDZf
>>494
何となく学習じゃあ、解決したい問題領域が曖昧なままだからな、何やっても難しく感じるよ。
0503デフォルトの名無しさん
垢版 |
2018/01/20(土) 16:49:26.40ID:I7uywYWL
もし依存型があったらリストの長さにより異なる型を使うね
でも遅延評価はリストの長さが有限でも無限でも同じ型にする
相性悪そう
0504493
垢版 |
2018/01/20(土) 18:46:54.97ID:oxqYKpr1
>>498
ありがとうございます
0505デフォルトの名無しさん
垢版 |
2018/01/24(水) 05:27:57.73ID:/4CMqd4L
hieとVSCode使ってるんだが、ドキュメントや入力候補が「読み込んでます」ってなって一向に読み込まれないんだが
お前らは問題なく使えてるの?っていうかどんな環境でやってる?
0508デフォルトの名無しさん
垢版 |
2018/01/27(土) 12:07:53.22ID:3P02pcTc
Haskellの良いところは宣言的であることです。
宣言的であるということはCSSのように素人には使いこなせないということです。
素人には使いこなせなくすることでウェブデザイナーという奇妙な職業が生まれました。
同様にHaskellもハスケラーという新たな職業を生み出す可能性があります。
0509デフォルトの名無しさん
垢版 |
2018/01/27(土) 17:18:06.19ID:Y4G+sRnH
コードの質の下限が他の言語より高いなとは思う
例えばPHPなんかは、プログラマの能力によって質の良し悪しのギャップが非常に大きい
それに対してHaskellは、上を見たらキリがないが、下を見てもコンパイルエラーを起こさない時点である程度の質が担保されてる
その分覚えることが多いし、短期的な開発効率も下がりそうだけど、長い目で改修や保守を考えると悪くなさそう
0515デフォルトの名無しさん
垢版 |
2018/01/31(水) 18:11:04.78ID:F9QE8ZcE
「プログラミングHaskell」(Graham Hutton (著),‎ 山本 和彦 (翻訳))
って入門者向け?
0517デフォルトの名無しさん
垢版 |
2018/02/01(木) 08:00:02.87ID:Xuh9WGFR
ghci で
> let x :: (a ~ Int) => a;x = undefined
として実際の型をみると
> :t x
x :: Int
に変わっている。これはどういう仕組みによるもの?
0518デフォルトの名無しさん
垢版 |
2018/02/02(金) 14:28:38.64ID:iEY/rJwQ
引数が Show a だったらTrue, 違ったら False を返す関数
isShow :: a -> Bool
は可能ですか?
0519デフォルトの名無しさん
垢版 |
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
0522518
垢版 |
2018/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 ...
-- コンパイルエラー!
0523デフォルトの名無しさん
垢版 |
2018/02/03(土) 22:01:25.34ID:GVlapN64
すみません、
Huttonの「プログラミングHaskell」で
学習をしているのですが
練習問題の解答が
著者や役者のサイト等を見ても見当たらなく
もし掲載のページを知ってたら教えて下さい。
0525523
垢版 |
2018/02/04(日) 12:22:57.81ID:VtcsF5YK
>>524
すみません。
原著者のサポートページでは回答例を見つける事ができませんでした。
翻訳されていないの新版には回答例が掲載されているようですね。
0528デフォルトの名無しさん
垢版 |
2018/02/22(木) 01:33:31.18ID:rShSr6qS
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 -- 通らない
0529526
垢版 |
2018/02/23(金) 11:53:44.22ID:QhNOj82G
ghcを8.0.2 から 8.2.2に上げた。
h = y :: a -> a -- 通るようになった
0531デフォルトの名無しさん
垢版 |
2018/03/08(木) 07:40:29.03ID:NOpOgpfl
emacsでSymbols function definition is void: haskell-debug
てエラー文が出ちゃうんですが、原因わかる人いませんか、、
正確にはspacemacsのinteroです、、
0532デフォルトの名無しさん
垢版 |
2018/03/12(月) 03:18:18.08ID:IKn+w3cq
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
0535デフォルトの名無しさん
垢版 |
2018/03/12(月) 07:14:31.89ID:IKn+w3cq
Haskellで一番売れている本の訳者様だぞ
0537デフォルトの名無しさん
垢版 |
2018/03/12(月) 12:35:28.53ID:jLS1yZxx
売上データを証拠として提出する発想が裁判所だな
裁判の真似事をやってるのは統計学者だ
0540デフォルトの名無しさん
垢版 |
2018/04/03(火) 13:16:07.09ID:CL00mLmV
モナドの中での条件分岐ってはどうやればいいでしょうか

m0 >>= m1 arg1 【 >>= m2 arg2 】 >>= mN argN

【 】のブロックを条件に応じて呼び出すかどうかを制御したいです
whenだと値が取り出せない
0542デフォルトの名無しさん
垢版 |
2018/04/03(火) 16:36:19.17ID:bMx8P0pN
遅延評価って面白いね
ぱっと見挙動がわかりにくいのと使い所がみつけづらいのが難点だけど
0544デフォルトの名無しさん
垢版 |
2018/04/13(金) 01:52:39.63ID:UkwKelSp
purescriptをめっちゃ強化してクロスコンパイル&ネイティブコンパイル&jsコンパイル&wasmコンパイル可能でさらにビルド速度とGC性能をocaml並に出来ませんか😱
0545デフォルトの名無しさん
垢版 |
2018/04/17(火) 11:35:04.71ID:qNbsUSYn
もし自作の型が Generic クラスのインスタンスなら、
その型を Num クラスのインスタンスにするのは容易でボイラープレートを書くだけだ、
という話を聞いたのですが、どういうことでしょうか。
0546デフォルトの名無しさん
垢版 |
2018/04/17(火) 15:15:39.87ID:xGORc44D
Genericは代数的データ型の代数的構造に対して型クラスを使えるようにする仕組みという感じだから
例えば自然数の型クラスがあったらdata Nat = Zero | Succ Natっぽい型をインスタンスにできる(ようにできる)
data List a = Nil | Cons (List a)とかもList a=Natでいけそうだけど詳しいことは知らない
でNumは整数の型クラスだから符号情報を持たせた自然数っぽい型で考えればいいと思う
0547デフォルトの名無しさん
垢版 |
2018/04/18(水) 21:28:14.85ID:BYjTZdeC
FRPのBehaviorとEventの構成ってなんか恣意的なのかなって印象で手付かずだったけど、
型がそれぞれ関数と直積で、カリーハワード考えるとForAllとExistsですよて説明見たら、
何に効いてくるのかまだよく分からんけど、真面目にやろうかなと思った。
0553デフォルトの名無しさん
垢版 |
2018/04/26(木) 12:38:49.74ID:X3BRJjDS
公開したくない自作データ型を引数に持つ自作関数を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 モジュールを使わないようルールを設ける。

他に何か良い方法はあるでしょうか。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況