関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/ 逆にそれ見たらどういう型だと思った?
Int -> Int -> Int
って思ったんじゃない?
なんの本読んでるかしらんけど
例えば add x y z なら Int -> Int -> Int -> Int だけど
実際には
Int -> (Int -> (Int -> Int))
こうなってるってことを言いたいんやろ >>696
add' :: Int Int -> Int
という型に見えます。 1 2
のように整数をスペース区切りで二つ並べたものに対して、
1 + 2
を対応させる関数に見えます。 関数を返す関数なんですから、
=
の右には数ではなく関数を書くべきです。 f x = x + 2
などの例を見て、
f ● = ■
という表記は、
f(●) = ■
という意味かと思います。 add は関数を返す関数じゃなくて引数を2つとって値を返す関数やろ
そこでもう勘違いしとる
add 2 3 の結果は関数じゃなくて値やろ?
add 2 のように引数を一個だけ渡したら部分適用されて引数を一個とる関数が返るってだけや
haskellはそういう部分適用できる関数を書きやすいように
add x y = x + y を add = \x -> (\y -> x + y)に自動で変換してくれるってだけ
糖衣構文ってやつ
嫌なら全部ラムダ式で書けばいいよ >>698
じゃああなたが今勉強してるカリー化って何なんですかね? **argv :: char
*argv :: char*
argv :: char**
add' x y :: Int
add' x :: a -> Int
add' :: b -> a -> Int
C言語を学習した人はHaskellも分かる
これが知能だ Haxe では関数の型は、
function sum (a:Int, b:Int) : Int
Int -> Int -> Int
引数1 -> 引数2 -> 戻り値
最後は戻り値 >>701
Haskellは関数適用が最優先だから
add' x y は (add' x) y って意味
だから add' x y = x + y は
「add' にxを適用した結果にyを適用した結果はx+yに等しい」と読める
ちなみに組み込み関数のuncurryを用いて add'' = uncurry add' とでも定義すると
add'' :: (Int, Int) -> Int
というおそらく>>698 でイメージしているであろうものに近い関数が得られる
Haskellのデフォルトの振る舞いはこちらではないという話 通りすがりだけど勉強になった
haskell面白そうだな Haskellちょっといじってると楽しいけどこれで飯食うのは自分には絶対無理という確信がある まずはHaskellの独壇場となるニッチ市場を開拓しないとな
どこかある? 写像をドメイン、コドメインのみ与えて定義するのが簡単にできればちょっと優位にたてる分野はある いまのHaskellには何が足らないのか。どんな分野で強みが活きるのか haskellでddd, cqrs, esのやり方を教えろください DDDが活きてくる(と見込める)ほどの規模の案件をhaskellで組むプロジェクトって凄いな
本格的にhaskellを導入してるんだね >>718
DDD は Extensible Effect と Tagless final がよく合う Haskellに欠けているのは中級者向けの書籍なのかも コンセプトは無茶苦茶面白いのに、肝心の実装が学級的で好き放題に流動的で恐ろしく無責任だからでは ひゃっほおおおう! ビルド通ったぜ
stackageの可能な限り全部の総計2352パッケージを含むプロジェクトのビルドがやっと通った。
もはや ghci をいったん落として stack.yaml と cabal ファイルにパッケージを追記し... などという面倒をしなくても
ただ import するだけでそれが利用可能になる。 spacemacsのinteroでデバッグできてる人います?
replを立ち上げた後、デバッグしようとする(spc m d d)と、
No Haskell session associated with this debug buffer.
てエラーが出て、先に進まないです。
上記はhaskell-debug.elの中に出てくるエラー文で、
上で立ち上げたrepl(stack ghci)がsessionとして認識されてないのが原因?な気がしますが、力及ばずって感じです。 すみません言語の話題から少し外れますが、
Windows10環境で
WinGHCiコンソール(ver 1.0.6)を使っているのですが
表示フォントをコンソラス等にしても
滑らかな文字表示がされず
メモ帳エディタの様な細いジャギー文字表示になります。
何か環境を弄ったり外部設定ファイルを書き換えたりして
外国のユーザー画面みたいな滑らか文字表示にする方法を
もしご存知でしたら教えて下さい。 ポールフダックの音楽/Haskellの本が延期しまくりでつらみ
慰めに手を出してみたreact+reduxが割と面白くてjavascriptおじさんになりそう ハスケルミュージックスクールってやつ
なら無料で読めるドラフトバージョンのやつよんだけど糞つまらんよ
ほとんどがライブラリーの使い方の説明しか書いてない その本です
定価で買うような本じゃなさそうですね… 木構造を表現するときの、「節」とか「葉」って、どう読みますか? 木をきと読むのならふし、は、
木をもくと読むのならせつ、よう
になる 733です
ありがとうございます
「き」「…」「は」で、「節」の読みを決めかねていましたが、>>736さんの仰るとおり、「ふし」で行くことにします すみません、733です
音訓(違うかな?)いずれかに寄せるべきと感じていたからです
他の方々もありがとうございました >>743
グラフ理論だと、文献にもよるけど、道、路、小道、歩道とか出てきて、統一不能感。 メモ化とスペースリークが本質的に同じもので、
言わば発酵と腐敗の関係の様なものだと知ったときは感動した。 >>747
元の英語がpath, trail, walkとか分かれてるのだが
文学なら訳し分けにくい概念は思い切って意訳することもできるが
技術用語だとそうもいかないのが難しいところ Coerce知らなかった。newtypeを自動で剥がしてくれる便利なやつ
import Data.Semigroup
import Control.Arrow
import Data.Coerce
aggregate :: [Int] -> (Maybe Int,Int)
aggregate' :: [Int] -> (Maybe Int,Int)
aggregate = (fmap getMax *** getSum) . foldMap (Just . Max &&& Sum)
aggregate' = coerce . foldMap (Just . Max &&& Sum)
https://speakerdeck.com/konn/ben-dang-hasugoi-newtype リストの要素がすべて異なる場合はTrue、
一つでも同じものがあれば False を返す関数を作りたい。
私が思いつく限りでは、次の方法が効率的には最適解だと思うのだが、どうだろうか。
リストが Eq と Ord のインスタンスであるという制限をかけた上で、
まずリストをソートし、それから隣の要素同士で同値関係を調べる。
ちなみに、これは○○問題などと名前がついているのだろうか。 名前をつけるとしたらグラフ○○かな
グラフ簡約のように木をグラフに変える問題 ソートは不要だし、どの言語でもdictionary/mappingにして要素数見るだけの作業のような >>752
ソートすれば、隣同士の要素の同値関係を調べるだけでよくなるから。
n個の要素を持つ未ソートリストの場合、
リストの第0要素を第1要素と、第2要素と・・・第n要素と比較する。
次にリストの第1要素を第2要素と・・・第n要素と比較する。
とやって、結局 O(n^2) の計算量が必要になる。
ソートするなら O(n log n) で済む。
と思ったけど、オレ勘違いしてるかな。
すまん、修理に出したPCがまだ帰ってこず、
試して速度比較できる環境にないんだ。 >>750
それも結局 O(n log n) だよね?
これが効率的には限界? >>755
アンカー間違えた。
>>753
それも結局 O(n log n) だよね?
これが効率的には限界? 一般的に同値関係とは推移律が成り立ってる関係のことを言うので
全ての要素に対して先頭の要素と同値関係が成り立つのなら任意の要素間で同値関係が成り立つ
ちなみにソートして全探索を早く打ち切らせるテクニックのことは貪欲法という dictionary云々はハッシュ関数で非可逆圧縮してからバケットソートするようなもの
バケットソートはO(n) >>757
なるほど、推移律ね、失念してた。
>>758
バケットソートは分かるが、問題はどうやってハッシュ値を求めるかだよね。
難しそうだが、考えてみる。
みんなありがと。 Arch LinuxのHaskellのリポジトリが
1年間メンテされずに死んでいる状態なのを見ると
Haskellもいよいよ落ち目だなと感じる そういう問題ではなく
向こうでHaskellへの関心が薄れているという事を言いたかった
メンテしていた人もHaskell離れしたかなとか想像できてしまう 本邦では昨年、Qiitaでのアドベントカレンダーは、HaskellがGoについで投稿数が多かった。 入門記事を読んだ人が入門記事を書いての繰り返しですやん。 >>764
数えたがアドベントカレンダーに限ってはそういうのは10個くらいだった。
120程の記事のうちで ネットでは大手のHaskell導入報告が続いて沸いてるとこだがお前らどんだけ情弱だよ Haskell使ってはいけないような低学歴知恵遅れが
Haskellに興味をもってるからな
低学歴知恵遅れがHaskell触ってはいけない
ヤバイことがおきる サイモンペイトンジョーンズがFacebookいってたけどさ、
バック→Haskell
フロント→React
みたいな構成ってそんなメジャーなんやろか FacebookはちょっとしたツールをHaskellで作ってますよ、位だと思ってたが…
>>766
> 大手のHaskell導入報告が続いて沸いてる
気づかなかった。他にはどこが? MonadIO は抽象度が高くて万能すぎ、オーバースペックだよ。
そのせいで、関数の中で何やってるのかシグネチャからは分かりにくいし。
ということで、もっと細かく分けようぜ、という話。
https://chrispenner.ca/posts/monadio-considered-harmful
簡潔で分かりやすい。
こういうのパターンっていうのかな。 githubを見る限りではとても盛り上がっているとは・・・
https://github.com/trending?l=haskell
相変わらず○○をHaskellで書いてみました系のプログラムばかり なんてことないfizzbuzzもHaskellで書くと楽しくなっちゃうんだよな
初めてプログラムを書いたときのwkwkを思い出させてくれる、それがHaskell Haskellでfizzbuzzをやろうとすると「数値か文字を出力する関数ってどうやるんだ?」
みたいなところでつまづきがち >>772
似たようなことはpurescriptではデフォルト(だった?) 結局は書く人本人が気持ちよくなる為の言語だね
パフォーマンスに優れるとかもないし 遅延ストリームを扱うならHaskellは速い方だろう
fizzbuzzの規模じゃそれを採用する利点はわからないけど むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」 「Haskellは参照透明性を保証するために、最適化を犠牲にした。
そのため、高い冗長性によってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で鈍速である」 >>784
returnとpureのこと言ってんの?
returnとpureのこと言ってんのーーーーッ!!? コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか >>787
ベテランになれば実用上問題ない程度には予測できるようになるんじゃね?
俺はまだまだ修行不足だけど 遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。 メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし 評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか くだらない質問で悪いけど質問させてほしい
Haskellでの優先順位について
・演算子の優先順位の記述はある
・関数適用の優先順位の記述はある
でも、関数の優先順位の記述が見当たらないんだけど(どっかに、左結合ってのはみた)
関数の優先順位はどうなるの?
要するに、かっこ付けの順番なんだけど
1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス ■ このスレッドは過去ログ倉庫に格納されています