X



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

レス数が950を超えています。1000を超えると書き込みができなくなります。
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 で支援を受ける
って方針を考えてる。どうかな
0928デフォルトの名無しさん
垢版 |
2020/01/03(金) 13:05:21.13ID:EVicjzWY
Haskellは妙にテクニカルな部分が多い気がする
2変数関数fと1変数関数gを合成するときに
g . f
ではだめで
g .: f where (.:) = (.) (.) (.)
って書くのとか良く思いつくなって感じ
0929デフォルトの名無しさん
垢版 |
2020/01/03(金) 13:32:58.92ID:r+r/o5nr
>>928
それは、ポイントフリーで書いているからテクニカルに見えるたけで、
引数を明記すればビギナーにも理解できる式になるぞ。
やってみれば分かる。

他のもそうだ。
例えばライブラリの作者がポイントフリーで書いているのは、
その方がベテランの作者やコミュニティーにとって読みやすいからだ。
彼らもビギナーを相手に解説する際は、
自分達には多少洗練されていない様に見えても、
ビギナーにとっての読みやすさを優先する。

日本語の文章における「漢字」と「かな」の関係のようなものだ。
0931デフォルトの名無しさん
垢版 |
2020/01/03(金) 13:53:52.89ID:biPe5Zol
g . f がだめな理由は型なので
fun<A, B> g;
fun<C, fun<D, A> > f;
このような型を宣言できる任意の言語に同じ問題がある
また、他の言語で問題が解決されたらHaskellでも解決できる
0932デフォルトの名無しさん
垢版 |
2020/01/03(金) 14:08:31.95ID:EVicjzWY
>>931
g :: b -> c
f :: a1 -> a2 -> b
に対して
(.) :: (b -> c) -> (a -> b) -> a -> c
の a を a1 -> a2 と解釈してくれれば話が速いんだけどね
a1 -> a2 -> b が実際には a1 -> (a2 -> b) で要は(->)が右結合だから駄目なのよね
0933デフォルトの名無しさん
垢版 |
2020/01/03(金) 15:06:47.95ID:r+r/o5nr
>>930
すまん、そういう話ではない。

「妙にテクニカルな部分が多い」と言うのは、
君の感じたhaskellの不満点や欠点なんだと俺は捉えたが、違うか?

2変数関数と1変数関数とを合成する関数(.:)の「型がまず先」にあって、

  (.:) :: (c -> d) -> (a -> b -> c) -> (a -> b -> -> d)

これを実装するのに

  (.:) = (.) (.) (.)

と書く者もいて、君に妙にテクニカルだと感じさせるのかもしれないが、

  (.:) g f = \a b -> g (f a b)

こう書けば、ビギナーにも容易に意味が読みとれる。
テクニカルでは全然ないだろう。

君が妙にテクニカルだと感じる大部分はhaskellの生来のものではなく、
単にビギナーに読めるようにも書けるコードをたまたまテクニカルに書いただけだ。

身の丈や好みに合った書き方をすれば不満に感じることはないだろう、と言いたかった。
0935デフォルトの名無しさん
垢版 |
2020/01/03(金) 16:07:32.31ID:EVicjzWY
>>933
Haskellに不満を持ってるとかではなくて単に凝った式に良く出会うというだけの話よ
そして凝った式を同値変形で分かりやすい式に変形するのが難しいことも多いと思う
個人的にはどう実装するかよりもどう同一視するかの方に興味がある
0936デフォルトの名無しさん
垢版 |
2020/01/03(金) 16:22:44.44ID:r+r/o5nr
>>935
そうだったのか、俺の完全な勘違いだった。
長文でレスの流れぶった切ってすまなかった。
0940デフォルトの名無しさん
垢版 |
2020/01/03(金) 21:54:01.12ID:jtHjGBI5
リストの1要素を書き換える関数が用意されてないのは、それが非推奨だからなの?
配列みたいな気分では使えないのかな
0941デフォルトの名無しさん
垢版 |
2020/01/03(金) 22:42:07.13ID:biPe5Zol
IOが非推奨ではないから
まるでIOが非推奨であるかのような関数が用意されていない事に違和感はない
0943デフォルトの名無しさん
垢版 |
2020/01/07(火) 18:53:28.45ID:KmM+4rGq
書き換えができるデータ型は定義できる
それを定義したモジュールにはその概念がある
そのモジュールと概念がHaskellの中にあるのか外にあるのかは知らん
0944デフォルトの名無しさん
垢版 |
2020/01/19(日) 01:06:57.37ID:7oa0iQg0
すみません質問なんですが、

f [5,4,8,7] == [5,(5+4),(5+4+8),(5+4+8+7)]

みたいな関数を作りたくて

g :: [Int] -> ([Int],[Int])
g (ys) = (ys,[1..length(ys)])

h:: ([Int],[Int]) -> [Int]
h (xs, []) = []
h (xs,y:ys) = sum (take y xs) : h(xs,ys)

f = h.g

と書いたんですけど、これって関数合成以外の方法で書けますか?
出来れば一つの関数で定義したいんですが、行き詰ってます(汗
0945デフォルトの名無しさん
垢版 |
2020/01/19(日) 01:34:42.77ID:lT5Fy0hi
コレはダメ?

sumlist [] = []
sumlist (x:xs) = x:(map (+x) $ sumlist xs )

main = do
print $ sumlist [5,4,8,7]
print $ take 10 $ [1..]
-----
[5,9,17,24]
[1,2,3,4,5,6,7,8,9,10]
0946デフォルトの名無しさん
垢版 |
2020/01/19(日) 01:37:22.32ID:lT5Fy0hi
間違った

sumlist [] =[]
sumlist (x:xs) = x:(map (+x) $ sumlist xs )

main = do
print $ sumlist [5,4,8,7]
print $ take 10 $ sumlist [1..]
----
[5,9,17,24]
[1,3,6,10,15,21,28,36,45,55
0951デフォルトの名無しさん
垢版 |
2020/01/19(日) 18:10:44.86ID:7oa0iQg0
944です。返信が遅れてしまってすみません。
>>945.947-948 さん早速の返答ありがとうございました。
レス数が950を超えています。1000を超えると書き込みができなくなります。

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