X



関数型プログラミング言語Haskell Part32

レス数が900を超えています。1000を超えると表示できなくなるよ。
0830デフォルトの名無しさん
垢版 |
2019/12/07(土) 02:10:24.53ID:nHnMq71L
ライブラリーのソースコードをレビューしてるWebサイトってありますか?
この書き方は秀逸だとか、これは泥臭いとか
バージョンアップでのコードの進化を追ったり

英語でも全く構わないのですが
0831デフォルトの名無しさん
垢版 |
2019/12/07(土) 04:27:22.19ID:AZmQeN3A
Windows 10 64bit 上で FFI (ccall) 使って Haskell の関数を呼び出してて
呼ぶ前に hs_init() が必要なのは,なんとなくわかるんだけど
hs_exit() の方は,そのあとアプリケーション全体がすぐ終了する場合は
呼ばなくてもいい?

Windows が呼び出し元のプロセスも Haskell ランタイムも開放してくれるよね
hs_exit() 呼ばなくても。たぶん
この辺,わかる人いますか
0832デフォルトの名無しさん
垢版 |
2019/12/07(土) 12:36:43.68ID:ZsYnLuoj
プロセス切り離せば?
そうでもしないと他言語呼び出しなんて低レイヤーデバッグする覚悟ないとやってられんぞ。
0833デフォルトの名無しさん
垢版 |
2019/12/07(土) 20:22:19.70ID:JHE2lozm
やってられない理由は低級言語でもHaskellでもなくGHC
Haskell実装はGHC以外にもいくらでもありえるから
0835831
垢版 |
2019/12/08(日) 05:30:16.98ID:9cPQrEyK
>>832, >>833
なんか GHC の FFI は
入っちゃいけない領域みたいに思えてきたんだがw

まぁたしかに,DLL で組み込むよりは別で組んだほうが
デバッグは圧倒的に楽だよね
(Rust でも DLL 書いてるけど,めちゃくちゃ苦労してる
0836デフォルトの名無しさん
垢版 |
2019/12/10(火) 15:02:27.60ID:6qyfceqR
計算のキャッシュをしたい。
ある重い計算 heavy :: IO Char があってそれを f,g :: IO () から呼び出す。
一度 heavy が呼び出されて Char が返ってきた後はそれを使いまわしたい。
f で呼び出したなら、その結果の Char を g でも使う。
ただし heavy の実行は f,g のどちらかが呼ばれるまではしたくない。

cachedHeavy = unsafePerformIO heavy
とすれば cachedHeavy が利用されたときに一度だけ簡約がおこなわれて、
その時だけ heavy が実行されるので、これを使えば事は足りる。
でもなるべく unsafe は使いたくない。どうすればいいでしょうか。
0837デフォルトの名無しさん
垢版 |
2019/12/10(火) 15:23:28.41ID:hI+yeapE
何もしなくても最適化で一回しか使われなくなるんじゃないの
haskellはそんなに馬鹿なの?
0838デフォルトの名無しさん
垢版 |
2019/12/10(火) 15:23:58.32ID:48kVELqA
memcached
0839デフォルトの名無しさん
垢版 |
2019/12/10(火) 17:01:00.59ID:6qyfceqR
>>837
ターミナルからの入力 readLine みたいにキャッシュしたくないときもあって、
上記のような値を普通に呼び出すコードからは、コンパイラは意図を判別できない。

>>838
なんぞそれ
0840デフォルトの名無しさん
垢版 |
2019/12/11(水) 22:52:31.45ID:r4LYbsNN
-- cached :: IO a -> IO (IO a)
main = cached heavy >>= \ cachedHeavy -> 云々
こういうのでいいならunsafePerformIOは不要
0841デフォルトの名無しさん
垢版 |
2019/12/12(木) 11:38:57.75ID:y6+ig4ik
>>840
はい。 f,g はトップレベルではなくIOアクションの中で定義しても大丈夫です。

IORefを使わなきゃ無理かな、と思ってたんだけど、これは目から鱗でした。
cached = pure
でいいんだよね?単にモナド一枚かぶせるだけで計算のキャッシュになるなんて、
今年一番のオドロキですわ
0843デフォルトの名無しさん
垢版 |
2019/12/12(木) 15:32:55.96ID:y6+ig4ik
>>842
うーん指摘の通りだった。
>>841 のやり方ではIOアクション cachedHeavy を簡約で実行した時点で heavy が計算される。
f や g の中でそれぞれ実行したなら都度重い計算が走ってしまう。
i <- cachedHeavy をその前に実行するなら一度で済むが、遅延の要件「f,g のどちらかが呼ばれるまではしたくない」
を満たさない。
0844デフォルトの名無しさん
垢版 |
2019/12/12(木) 15:46:44.83ID:y6+ig4ik
つまり… こんな感じでいいのかしら

cached :: IO a -> IO (IO a)
cached f = do
 r <- newIORef Nothing
 pure $ do
  c <- readIORef r
  case c of
   Nothing -> do
    ts <- f
    modifyIORef r . const . Just $ ts
    pure ts
    Just ts -> pure ts

> x <- cached $ print "heavy" >> pure 42
> x
"heavy"
42
> x
42
0846デフォルトの名無しさん
垢版 |
2019/12/13(金) 11:45:01.85ID:Zghtw6X7
>>845
間違っているところがあったら、具体的に教えていただきたい。
0847デフォルトの名無しさん
垢版 |
2019/12/14(土) 10:44:10.58ID:EaJih9JU
cabalファイルの中でexectableで同じcabalファイルの
ライブラリー名をbuild-dependsにかいてあるのに
そのライブラリーのbuild-depensを全部書かないとコンパイルできない
のはなんで?テンプレート使ってるからとかある?
0848デフォルトの名無しさん
垢版 |
2019/12/14(土) 14:55:50.10ID:EaJih9JU
ソースディレクトリをexeとlibに別々にしたら直った
なんだこのバグは酷いバグだ
0852デフォルトの名無しさん
垢版 |
2019/12/17(火) 08:07:51.17ID:hHVSxQ9g
キャッシュ? https://wandbox.org/permlink/98ZKnQW0uSr5c5CV

f () = print "hoge" >> getLine >>= \x -> print "foo" >> return (\() -> x)
main = do
putStrLn "1234"
f () >>= \g -> do
let e = g ()
print e
print e
0853836
垢版 |
2019/12/17(火) 15:16:27.15ID:zdxsmCDQ
>>852
たしかに f で行なった計算の結果を g で使えてるけど、俺の求めてたのは
さらに g の結果も f で使えることなんです。どっちを先に実行しても計算は一度だけ、を求めてた。
0854デフォルトの名無しさん
垢版 |
2019/12/17(火) 22:59:40.32ID:nTHXuzTI
そもそもライブラリを全てimportする奴はいないので
使わなかったライブラリのコードは最後まで実行されない
全てのライブラリについて使うか使わないか予測できないならば実行の順序は予測できない
0855デフォルトの名無しさん
垢版 |
2019/12/18(水) 00:29:20.63ID:RN3F5ybK
>>854
ここにいるぜ。まあ可能な限り、ということだけども…
多すぎでリンクできなくてGHCが落ちるのが面白かった。
0856デフォルトの名無しさん
垢版 |
2019/12/18(水) 09:15:25.20ID:fJHQ6oEy
え、岡部健ってQuoraで暴れてたの?
アカウント停止はまた癇癪起こして名誉毀損してたとかが理由??
0857デフォルトの名無しさん
垢版 |
2019/12/18(水) 11:17:26.49ID:RrfoIO3F
>>856
彼がなにかしらのコミュニティーでうまくやっていけないのは、これまでの活動からわかりきっている。
むしろ、Quoraではよく持った方だと思うよ。お薬をきちんと服用するようになってるんだろうね。
0859デフォルトの名無しさん
垢版 |
2019/12/19(木) 00:31:57.76ID:MqZ434Qi
haskell自体はいいんだけどstackとかhieとかいちいちでかくてめんどくさい
本当にhaskell書いてる人はいるの?
0860デフォルトの名無しさん
垢版 |
2019/12/19(木) 07:07:47.77ID:lwXrm8Zb
依存関係を管理するのは理想
依存関係を消すのが現実
C++やSTLに依存することすら嫌ってCだけで書くみたいな現実
0862デフォルトの名無しさん
垢版 |
2019/12/19(木) 10:21:19.22ID:+cpLTGtZ
>>860
Rubyをdisるのは止めれ
0863デフォルトの名無しさん
垢版 |
2019/12/19(木) 14:13:07.54ID:rbd8D3sc
実際にHaskellでコード書いてみると分かるけど
コンパイル通れば計算結果は確かに正しいんだけど
巨大なメモリを謎に使うようなバグが混入する事が結構あって
その種類のバグってエラー吐かないから特定がめっちゃ難しい。
巨大なプロジェクトでHaskell使うのは現実的には無理だと思う。
0865デフォルトの名無しさん
垢版 |
2019/12/19(木) 14:54:58.39
あればあるだけ使おうとするんでない?
足りなくなってからようやく(これからやる処理に必要最低限の)ガベコレ
この繰り返しだから永遠に自転車操業
0866デフォルトの名無しさん
垢版 |
2019/12/19(木) 19:09:11.03ID:rbd8D3sc
この種のバグの混入原因って大抵の場合
ネットに散らばっている'Haskellらしい'記法にあったりするから
初心者の頃に読んだ書き方が
「(実はこの人全然Haskellでコード書いてないじゃんっ!!)」
と気が付くまでワンセット

ネット上だと処理が大きくなると破綻するようなサンプルコードばっかりでウンザリする
特に遅延評価を活用するような記法は
大抵メモリ関連のバグの原因になるから実際には避けなきゃダメなのばかり
0868デフォルトの名無しさん
垢版 |
2019/12/19(木) 20:49:23.97ID:lwXrm8Zb
ガベコレ言語を全否定してみるのも一つの方法
たとえばスマホが壊れたら全部新品にするかそれとも壊れた部品を特定してそこだけ修理するか
0869デフォルトの名無しさん
垢版 |
2019/12/19(木) 20:50:47.99ID:mvsIV7PX
結局最適化しようとするとコンパイラのくせをしっかり理解してたり
凄まじい技術力がいるという。。
0872デフォルトの名無しさん
垢版 |
2019/12/20(金) 11:16:14.21ID:MYxSal4F
>>871
俺は「あぁ,Haskell でいうアレね」みたいな感じで学べた
厳密な感じが好きなら,気にいるんじゃないのかな
ドキュメントも揃っていて学びやすいと思う

ただ,俺はいまいち使い所を見いだせてない
Haskell で書ける分野なら Haskell で書いちゃうし
ちょっとしたツールとかサーバーサイドとかは Go のが楽だし

WebAssembly を生成するために使うのが
今一番,Rust の活きる分野な気がする
Rust は,クロスコンパイルが楽なので

(個人の感想です
0876デフォルトの名無しさん
垢版 |
2019/12/23(月) 17:59:43.65ID:/flai8cL
もしかしてParsecってあんまり使われてない?
Parsecのドキュメントが2001年とか古いのしか無くて、最初のサンプルコードすら通らない
ライブラリの使い方が解らなくていきなり躓いてる
0877デフォルトの名無しさん
垢版 |
2019/12/23(月) 18:29:48.72ID:B7hjQJ1Z
ここの住民、圏論とかの話だと玄人っぽいのにプログラミングの話になると初心者っぽくて謎
0878デフォルトの名無しさん
垢版 |
2019/12/23(月) 20:24:57.43ID:E1rjr0pL
>>876
ドキュメントと言うのが何を指しているのか具体的なURLを示してくれないと、
何が原因でどう躓いているのか、助けようにも調べる取っ掛かりが無くて困る。

あと、本当にその古いドキュメントとやらしか学習資料は無いのか?
他にチュートリアルやブログなどは参考にならないのか?
0879デフォルトの名無しさん
垢版 |
2019/12/23(月) 20:56:14.64ID:A/dzNHpI
どうせ躓くなら一番最初に躓く初心者っぽい奴の方が運が良い
ビギナーズラック

巨大なメモリを使う巨大なプロジェクトの完成直前に躓くのはかなり運が悪い
0882デフォルトの名無しさん
垢版 |
2019/12/23(月) 21:59:30.49ID:/flai8cL
最初のサンプルコードをGHCiで打ち込んで試そうとしてるんですが、

Prelude> module Main where
Prelude> import Parsec

<no location info>: error:
Could not find module ‘Parsec’
Perhaps you meant Parser (needs flag -package-key ghc-8.6.5)

モジュールが見つからないと言われます
最新バージョンの名前空間?と明らかに違っているので、
ここ[Text.Parsec](http://hackage.haskell.org/package/parsec-3.1.14.0/docs/Text-Parsec.html)で、この二行

import Text.Parsec.Prim
import Text.Parsec.Combinator

を見付け書いたところ

Prelude> import Text.Parsec.Prim
Prelude Text.Parsec.Prim> import Text.Parsec.Combinator

<続く>
0883デフォルトの名無しさん
垢版 |
2019/12/23(月) 22:00:22.40ID:/flai8cL
Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: Parser Char

<interactive>:6:11: error:
Not in scope: type constructor or class ‘Parser’
Perhaps you meant one of these:
‘Parsec’ (imported from Text.Parsec.Prim),
‘ParsecT’ (imported from Text.Parsec.Prim)
Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: Parsec Char

<interactive>:7:11: error:
? Expecting two more arguments to ‘Parsec Char’
Expected a type, but ‘Parsec Char’ has kind ‘* -> * -> *’
? In an expression type signature: Parsec Char
In the expression: simple :: Parsec Char
In an equation for ‘it’: it = simple :: Parsec Char
Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: ParsecT Char

<interactive>:8:11: error:
? Expecting three more arguments to ‘ParsecT Char’
Expected a type, but
‘ParsecT Char’ has kind
‘* -> (* -> *) -> * -> *’
? In an expression type signature: ParsecT Char
In the expression: simple :: ParsecT Char
In an equation for ‘it’: it = simple :: ParsecT Char

引数が足りないみたいなことを言われます
英語も怪しいのに英語の解説も使えないとなるとどうして良いやら…
0884デフォルトの名無しさん
垢版 |
2019/12/23(月) 22:04:05.15ID:pH3djwe1
haskell ide engine って今どんな使用感?
そろそろ spacemacs haskell layer (中身 intero) から乗り換えようと思ってんだけど
未だにバージョン 1 未満なのが気になった。まだ待つべきかな。
0886デフォルトの名無しさん
垢版 |
2019/12/23(月) 22:07:10.46ID:wextYSDX
>>877
クヌースなんかもそんなもんだぞ。
プログラム理論と実装ガツガツやる能力は別物だから。
0887デフォルトの名無しさん
垢版 |
2019/12/23(月) 22:28:25.82ID:pH3djwe1
>> 883
このエラーメッセージ
Not in scope: type constructor or class ‘Parser’
これは Parser が見つからないよ。みたいな意味

検索サイトのフーグルを「パッケージ指定」機能を使って探すと
https://hoogle.haskell.org/?hoogle=Parser%20package%3Aparsec
Parser は import Text.Parsec.String すれば使えるってことが解って、
同じように letter の場所も調べられる。

attoparsec や megaparsec にも似たやつあるっぽいから、何となくで読み替えていけばいいんじゃないかな。
0888デフォルトの名無しさん
垢版 |
2019/12/23(月) 23:28:55.39ID:fuVSP632
>>886
> クヌースなんかもそんなもんだぞ。

Knuthはそんなことはないだろ
TeXもMetafontも最初のはKnuth自身が実装したのだから

> プログラム理論と実装ガツガツやる能力は別物だから。

圏論なんかの知識は実装と全く関係ないからね、そういう方面に明るいのと実装能力とは全く無関係だ
0889デフォルトの名無しさん
垢版 |
2019/12/23(月) 23:34:33.07ID:A/dzNHpI
KnuthやLinusって
圏論どころかカプセル化・継承・ポリモーフィズムすら使ってない印象がある
実装能力とは全く無関係だし
0891デフォルトの名無しさん
垢版 |
2019/12/24(火) 08:12:11.27ID:IDR7+yeu
何をもってknuthにスキルを疑うのか分からんのだけど、彼のプログラミングスキルが
ゴミクズな世界があったとしても、scratchから書く問題ならアルゴリズムだけで
他の人より速いもの書いてそう
0893デフォルトの名無しさん
垢版 |
2019/12/24(火) 21:34:10.54ID:4c9jV6+e
本人がtex書くまでこれほど大変と思ってなかったいうとるやん。
そのあとの文芸プログラミングとか、cのコード見てても、これあかんなとしか思わんわ。
0894デフォルトの名無しさん
垢版 |
2019/12/27(金) 22:57:25.24ID:LIBStdaN
Getting started with Haskell
https://stackoverflow.com/questions/1012573/getting-started-with-haskell

https://stackoverflow.com/questions/tagged/haskell
https://stackoverflow.com/questions/tagged/functional-programming
https://stackoverflow.com/questions/tagged/monads
https://stackoverflow.com/questions/tagged/category-theory
https://stackoverflow.com/questions/tagged/functor
https://stackoverflow.com/questions/tagged/ghc
https://stackoverflow.com/questions/tagged/ghci
https://stackoverflow.com/questions/tagged/haskell-stack
https://stackoverflow.com/questions/tagged/cabal
.
.
.
0895デフォルトの名無しさん
垢版 |
2019/12/28(土) 23:16:17.55ID:wvWoDqVP
Haskellは小さいプログラムを作るには最適なんだけど
大きいプログラムになるとメモリ周りの最適化が困難なのよね
実行結果自体は正しいからテストすり抜けるだろうし
バックエンドで採用しても
本番環境で初めてメモリヤバイと気付いて死ぬ未来しか見えない
0900デフォルトの名無しさん
垢版 |
2019/12/29(日) 16:42:39.91ID:ADVmDYvb
遅延評価を諦めて型システムとパターンマッチ系統だけを
よくわからないけどCとかC++辺りに持っていくじゃだめかな
0902デフォルトの名無しさん
垢版 |
2019/12/30(月) 01:49:49.36ID:zGgGf8ov
赤黒木のコード読んでいたら
関数の定義に型情報があるけど
型推論で処理されるコード部分には型情報がない
目視で定義ーコード部を交互確認すると結構きつい

抽象化には貢献してるけど、人間が読み下すのは大変、オレはコンピュータじゃない(怒
そんな感じ
0904デフォルトの名無しさん
垢版 |
2019/12/30(月) 09:12:01.80ID:zGgGf8ov
要件定義が整っている関数の書き下ろしと
プログラムで記述されたコードの読み下しは難度が異なる
Haskellのコードは情報密度が高い事と抽象度の高さが強烈に効く
0905デフォルトの名無しさん
垢版 |
2019/12/30(月) 09:50:40.36ID:aMPpMkgz
Hakellだしコード読めば分かるだろ(コメントなし)
↓数カ月後
俺の書いたコードなのに意味が分からない・・・
0907デフォルトの名無しさん
垢版 |
2019/12/30(月) 12:14:13.13ID:WAqdspci
>>905
次の日とか
その日のうちでも
意味が分からなくなることがある
0908デフォルトの名無しさん
垢版 |
2019/12/30(月) 13:26:36.21ID:khitn85K
赤黒木は左右対称のコードを2回書かされるから書きたくない
コードを読まなくても分かる
読む前から分かることをどれだけ知っているかが重要
読み始めてから努力するのは遅い
0911デフォルトの名無しさん
垢版 |
2019/12/30(月) 21:52:49.75ID:rDj24KcK
>>909
よく読め、受賞は2019年だが
受賞内容は2009年の功績の話だぞ
そこで語られてる内容も2014年のGHC魔改造の件の話だし
5年も経過してるのに未だにその話しか出てこないって事はそういう事よ
0912デフォルトの名無しさん
垢版 |
2019/12/30(月) 22:25:35.97ID:khitn85K
よく読んだら分かること
読まなくても分かること
普遍的な方を重視するのがいいと思うよ
0914デフォルトの名無しさん
垢版 |
2019/12/31(火) 00:12:07.17ID:Lj+eqMzp
ちなみにFacebook自身は2015年の投稿で2年かけて
Sigmaの主要技術をHaskellに移行したといっている
https://engineering.fb.com/security/fighting-spam-with-haskell/

スライドもある
http://multicore.doc.ic.ac.uk/iPr0gram/slides/2015-2016/Marlow-fighting-spam.pdf


そしてSigma の Software Engineering Manager の公募を最近LinkedInでかけていた
職位はManagerだし応募要件にはHaskellスキル必須とは記載していないようなので
Haskellが実用的に使われているっていう傍証にはならないけどプロジェクトは生きてる様子

またその後別の各技術にとってかわられたという情報もなさげ
0918デフォルトの名無しさん
垢版 |
2020/01/01(水) 04:13:12.99ID:IaAF7ILo
Haskellを始めたばかりの者です
do構文は多用しても良いのですか?
手続き型を書いているような気分になります
関数型言語は初めてなので不安です
0919デフォルトの名無しさん
垢版 |
2020/01/01(水) 09:08:22.50ID:msO/HyKq
>>918
いいよ。モナドは手続きを実現するのに役立つ抽象だよ。
でもアプリカティブで用が足りるならアプリカティブを使うべき。
IO モナドを do で合成するシーンが多いならリファクタリングの余地があるかも。
Control.Monad や Control.Applicative のユーティリティが利用できないか検討してみて
0920デフォルトの名無しさん
垢版 |
2020/01/01(水) 09:16:52.80ID:msO/HyKq
=>= 2020年の抱負 =>=

・珠玉本を再開したい。少なくとも二度目の四天王登場回までは行きたい
・Haskell でごはん食べる
0923 【最底辺】 【25円】
垢版 |
2020/01/01(水) 13:25:14.55ID:tqBP4ADq
Haskellの未来
0926デフォルトの名無しさん
垢版 |
2020/01/02(木) 07:13:34.68ID:RghxuQ5t
OSS として良さげなツールを作って
Github Sponcers で支援を受ける
って方針を考えてる。どうかな
レス数が900を超えています。1000を超えると表示できなくなるよ。

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