関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net

0001デフォルトの名無しさん2017/01/15(日) 23:43:54.28 ID:Vh4eztBk
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/test/read.cgi/tech/1428597032/

0002デフォルトの名無しさん2017/01/15(日) 23:46:14.19 ID:Vh4eztBk

0003デフォルトの名無しさん2017/01/15(日) 23:46:30.44 ID:Vh4eztBk

0004関連サイト2017/01/15(日) 23:47:46.51 ID:Vh4eztBk
(英語)
Haskell - Wikibooks, open books for an open world (ページ内に内容をまとめたPDFあり)
https://en.wikibooks.org/wiki/Haskell

Learn You a Haskell for Great Good! (『すごいHaskellたのしく学ぼう!』の無料オンライン版)
http://learnyouahaskell.com/chapters

Real World Haskell (同名書籍の無料オンライン版)
http://book.realworldhaskell.org/read/

(以下、日本語)
Haskell入門 5ステップ - HaskellWiki (公式サイト内、日本語入門セクション)
https://wiki.haskell.org/Haskell%E5%85%A5%E9%96%80_5%E3%82%B9%E3%83%86%E3%83%83%E3%83%97

Haskell - Wikibooks (上記Wikibooksの同タイトル日本語版。多くの項目が未編集)
https://ja.wikibooks.org/wiki/Haskell

Programming in Haskell
http://www.sampou.org/cgi-bin/haskell.cgi

Haskell のお勉強
http://www.shido.info/hs/

Haskell Programming
http://www.geocities.jp/m_hiroi/func/haskell.html

本物のプログラマはHaskellを使う:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/

[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!
http://gihyo.jp/dev/feature/01/functional-prog

0005デフォルトの名無しさん2017/01/16(月) 07:56:53.70 ID:fQO7vc6n

0006デフォルトの名無しさん2017/01/16(月) 15:43:59.55 ID:WQ/ved8Z
Wikipediaの人工知能に適した言語のリストにHaskellがあったけど、やはり最近流行りの統計的なアプローチがされているのかな

LogicTモナドが使えるらしいけどよく分からない

0007デフォルトの名無しさん2017/01/16(月) 19:31:44.98 ID:FYjqZVjV
適しているという話は聞いても
使われているという話を聞いた事はない不思議

0008デフォルトの名無しさん2017/01/16(月) 19:44:49.27 ID:MHdfZn+y
>>7
村主さんが開発したFormura(Formulaではない)というプログラムを自動生成するプログラミング言語があるみたい

人工知能ではないけど似たものを感じる

0009デフォルトの名無しさん2017/01/16(月) 20:10:23.15 ID:cwyxJ1cI
ディープラーニングはほぼ完全にPythonに食われちゃった

0010デフォルトの名無しさん2017/01/16(月) 21:52:49.11 ID:e08JNJ9T
前スレで質問しようとして何か変な風に失敗してしまいました...
再掲させてください

----
aojの問題でわからないところがあるので質問します.
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0033
二股にわかれた容器に1から10まで番号のついたボールを番号の大小関係の制約を守って並べていけるかを判定する問題なんですが,自分のコードを提出するとruntime errorになってしまいます.
理由も考えたんですがよくわからないので,何がダメなのかアドバイスをお願いしたいです.


main :: IO ()
main = getContents >>= mapM_ (putStrLn . (\arr -> solve (tail arr) 0 (head arr, 0)) . map (read :: String -> Int) . words) . tail . lines

solve :: [Int] -> Int -> (Int, Int) -> String
solve arr index (box1, box2)
| index == length arr = "YES"
| otherwise =
if box1 < box2 then
solve arr index (box2, box1)
else
if arr !! index > box1 then
solve arr (index + 1) (arr !! index, box2)
else
if arr !! index > box2 then
solve arr (index + 1) (box1, arr !! index)
else
"NO"

0011デフォルトの名無しさん2017/01/16(月) 23:17:40.44 ID:7uYw7kg2
競技プログラミングにハマるプログラマのスレ 8
http://tamae.2ch.net/test/read.cgi/prog/1483782812/l50

0012デフォルトの名無しさん2017/01/16(月) 23:44:35.96 ID:YUCFPIN/
まあHaskellの質問だとHaskellスレで聞かないとスルーされるから
回答してあげるのが優しさってもんよ。

0013デフォルトの名無しさん2017/01/17(火) 00:17:06.16 ID:BMtHP56w
優しい回答例
エラーの原因を探し出しその場所をピンポイントで変更してあげる

優しくない回答例
面倒だから変更できそうな場所は必要あろうがなかろうが全部変更してみろ

0014デフォルトの名無しさん2017/01/17(火) 00:47:05.23 ID:gDgxXQqt
>>10
http://judge.u-aizu.ac.jp/onlinejudge/solution.jsp?pid=0033&lid=13

haskell回答は3人しかいないな

0015デフォルトの名無しさん2017/01/17(火) 01:19:14.78 ID:+KcFvgyU
if arr !! index > box1 then
solve arr (index + 1) (arr !! index, box2)
else

の部分では、box1>box2 なのでどちらの分岐も考えられる
出力の型をBoolに変更し

if arr !! index > box1 then
solve arr (index + 1) (arr !! index, box2) || solve arr (index + 1) (arr !! index, box2)
else

でどうでしょう。で後からTrue,FalseをYES,NOに変えればOK 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)

0016デフォルトの名無しさん2017/01/17(火) 01:20:40.28 ID:+KcFvgyU
訂正

if arr !! index > box1 then
solve arr (index + 1) (arr !! index,box2) || solve arr (index + 1) (box1,arr !! index)
else

0017デフォルトの名無しさん2017/01/17(火) 01:35:04.21 ID:9da45IOD
>>15
勘違い。これは原因ではないので無視してください

0018デフォルトの名無しさん2017/01/17(火) 01:48:42.05 ID:gNSY+qrn
皆さん
反応ありがとうございます.
Haskellは周りに聞ける人がいなかったので助かります

0019デフォルトの名無しさん2017/01/17(火) 13:27:32.57 ID:KBo6p4cv
Haskellで競プロは隔靴掻痒という感想
実行制限時間がC++を前提に設定されてるから辛い
しかも Haskell 提出者が少なすぎて、AC 解答を覗いて速いコードを書く知見を獲るということができない

強い Haskeller 先輩各位は競プロサイトにアカウントを作って(競技には参戦しなくてもいいから)暇なときに過去問で誰も Haskell による AC が出てないものを適当に AC していって知見をバラまいてリードしてほしい

0020デフォルトの名無しさん2017/01/17(火) 17:07:58.89 ID:upTI+ygx
>>10 の問題は実際のアプリ作りのどういうシーンに応用できるの?

0021デフォルトの名無しさん2017/01/17(火) 18:24:57.23 ID:BMtHP56w
アプリの有用性ではなく難易度を研究してるんだろう

例えば人工知能が完成したらどれだけ役に立つかではなく
実際に完成する確率は何パーセントくらいかに興味がある

0022デフォルトの名無しさん2017/01/17(火) 20:38:31.88 ID:+KcFvgyU
頓珍漢な質問かもしれませんが

ghciの:sprintでその時点での式の評価の深さを知ることができると思うんですが
評価の深さ自体を扱うプログラムを組むことってできるのでしょうか

0023デフォルトの名無しさん2017/01/17(火) 21:11:08.46 ID:yOV+pApV
>>22
評価の深さって何?
浅い評価と深い評価の例を挙げてみてくれないか。

評価の深さ自体を扱うって、具体的には何がしたいの?
特に何かしたい訳じゃなければ、どういうプログラムを想定しているか、
に置き換えてもいいんたが、とにかく何か具体例がないと、
何を言っているのか分からん。

0024デフォルトの名無しさん2017/01/17(火) 22:10:59.79 ID:+KcFvgyU
>>23
考えなしに深さという言葉を使ってしまいました
リストの評価についてです

Prelude> let xs = map (*2) [1..5]
Prelude> :sprint xs
xs = _
Prelude> xs `seq` ()
()
Prelude> :sprint xs
xs = _ : _
Prelude> length xs
5
Prelude> :sprint xs
xs = [_,_,_,_,_]
Prelude> xs !! 2
6
Prelude> :sprint xs
xs = [_,_,6,_,_]
Prelude> xs
[2,4,6,8,10]
Prelude> :sprint xs
xs = [2,4,6,8,10]

といったようになりますが
ある時点の評価について二つのリストが同じになる可能性があればTrue、なければFalseを出力するようなことをしたいと思っています。
例として、[_,_]と[_,_]や、_と[_,_]、_:_と[_,_]、[1,_]と[_,2]などはTrue。
[_,_,_]と[_,_]、[_,1]と[_,2]などはFalseになると言った感じです。

似たようなことがスマートにできる方法があれば教えて頂きたいです。

0025デフォルトの名無しさん2017/01/17(火) 22:52:03.18 ID:yOV+pApV
>>24
ghc-heap-viewとかのghcハック関係のライブラリや、それらのソースをあさってみてはどうだろう。

俺も調べてみて初めて知ったが、ghc-visって面白そうだな。

0026デフォルトの名無しさん2017/01/17(火) 23:13:22.52 ID:+KcFvgyU
>>25
ありがとうございます!
その辺りを勉強してみます。

0027デフォルトの名無しさん2017/01/20(金) 20:35:21.61 ID:UH4PToPO
すごいとプログラミングの2冊よんだけど次どうすりゃいいの
本殆ど無いし

0028デフォルトの名無しさん2017/01/20(金) 21:07:25.07 ID:NJo0QCWa
好きなもの作ればいいと思うよ

0029デフォルトの名無しさん2017/01/20(金) 21:27:38.70 ID:F6U1j3oz
俺は静的型付けをゴリ押しされたのでHaskellをやってみたけど次はC++かな
静的型付けの本がないならHaskellとC++の本を読む

0030デフォルトの名無しさん2017/01/20(金) 23:07:09.10 ID:Mei5GLPp
>>27
CUIの家計簿アプリを作る。
それができたら、GUIの年賀状アプリを作る。

0031デフォルトの名無しさん2017/01/20(金) 23:25:09.60 ID:elfFgoly
普段から家計簿をつけないし
毎年年賀状も出さない
作るならもっと実用的なアプリはないか

0032デフォルトの名無しさん2017/01/21(土) 00:19:25.12 ID:0azuxgYp
麻雀AIを作るばよい

0033デフォルトの名無しさん2017/01/21(土) 01:18:36.08 ID:vr64D6+/
Real World Haskell って不人気なの?

0034デフォルトの名無しさん2017/01/21(土) 06:37:05.65 ID:9Cnx0LpZ
Real World Haskell ってやつで勉強してみるは!

0035デフォルトの名無しさん2017/01/21(土) 08:24:01.76 ID:bTMqa3aS
>>31
じゃあ部屋の写真や動画から、その部屋の3Dモデルを生成するアプリは?
模様替えとか、新しい友人に紹介する時とかに便利。

0036デフォルトの名無しさん2017/01/21(土) 10:48:25.57 ID:bTMqa3aS
質問

stack でドキュメントも同時に生成するようにビルドすると(haddock: true)、
依存してるstackageのパッケージのドキュメントは生成されるけど、
stack.yamlのextra-depsの項に追加したパッケージの物は生成されなかった。

後者のドキュメントも生成して、
~/.stack/snapshots/<arch>/<lts version>/<ghc version>/doc/
に追加したいのだが、何か方法はないだろうか?

0037デフォルトの名無しさん2017/01/21(土) 11:52:22.55 ID:Rj5My/0A
>>36
haddock-deps: true
でいけると思う

0038デフォルトの名無しさん2017/01/21(土) 13:02:10.06 ID:bTMqa3aS
>>37
ありがと、できた。

少し前に stack build --help でオプション一覧を見たはずなんだが、
ボケてたのか、すっかり見逃してたみたい。

0039デフォルトの名無しさん2017/01/21(土) 13:29:53.85 ID:bTMqa3aS
>>37
できたと思ったら勘違いだった。

プロジェクト内の .stack-work にはドキュメントが作られるが、
~/.stack/snaoshots 内のドキュメントには融合されない。

0040デフォルトの名無しさん2017/01/21(土) 23:24:33.24 ID:pbRX6RFT
>>27
プロジェクトオイラーあたりに取り組んでみるとか
アルゴリズム系で骨のある課題がお望みなら「珠玉のアルゴリズムデザイン」をどうぞ

0041デフォルトの名無しさん2017/01/21(土) 23:51:49.78 ID:Rj5My/0A
>>39
うーん、調べてみたけどわからなかった。
stack build --exec CMD でビルド後にドキュメントをコピーするか
stack build --haddock-arguments ARGS でstackからhaddockに渡るパスを上書きするとか
そういうのは思いついたけど、どっちにしても厳しいハックになると思う。

0042デフォルトの名無しさん2017/01/22(日) 02:31:21.87 ID:/vT6BoNb
なんでStringってshowするときに” “ が付くの?
ダブルクォートが付かない汎用的なshowは無いの?

0043デフォルトの名無しさん2017/01/22(日) 06:46:55.70 ID:0MfM9wAO
show使わなきゃいいだけじゃね

0044デフォルトの名無しさん2017/01/22(日) 09:49:36.00 ID:DE1XkK5k
>>41
調べてくれて、ありがとう。
こっちでもって調べてみたけど、そもそも同じ悩みを持ってる人が見当たらない。

とりあえず今回は諦めて保留にするよ。

0045デフォルトの名無しさん2017/01/22(日) 11:16:36.00 ID:8a05MHn2
実用上全く考えたこともなかったけど
show "ABC"
って
"\"ABC\""
って出力されるんだなwwwwウケる

show $ show "ABC"

"\"\"ABC\"\""

wwwwwwwwwww

0046デフォルトの名無しさん2017/01/22(日) 12:04:32.12 ID:+cEF+CqT
>>42
show 2 と show "2" が区別できないと困るじゃん

0047デフォルトの名無しさん2017/01/22(日) 13:42:11.92 ID:KAhPA/LR
>>42
どうしても欲しいなら作ればいい。

{-# LANGUAGE FlexibleInstances #-}
instance {-# OVERLAPPING #-} Show [Char] where show = id

0048デフォルトの名無しさん2017/01/22(日) 13:55:33.85 ID:1WETee73
id = read . show にするためだゾ

0049デフォルトの名無しさん2017/01/22(日) 14:50:30.18 ID:ppe8FoC9
>>19
強いHaskeller先輩「(・・・これC++で提出した方が早いな)」

0050デフォルトの名無しさん2017/01/22(日) 18:20:13.46 ID:TMVq9uWR
スペースリークの問題があってまともなコードには使えないというイメージを持ってるんだが
最近はその辺どうなってるのか知ってる?
自分はホームページ出力とかのメモリリークが問題にならないコードにhaskell使ってる
でもスペースリーク解決したらもっと色んなソフト開発に使ってみたい

0051デフォルトの名無しさん2017/01/22(日) 19:13:53.53 ID:0MfM9wAO
>>49
haskell-masterことtanakhさん!

0052デフォルトの名無しさん2017/01/22(日) 20:48:57.10 ID:2pJ85nMW
tanakhさんは最近はHaskellどころか競プロにRustで提出しだしてるよ…
tanakhさんはHaskellを見捨てたんだ…

0053デフォルトの名無しさん2017/01/22(日) 21:14:58.84 ID:0MfM9wAO
そもそもhaskell-masterと名乗って参加してたのがhaskell使えないTopCoderだったしなtanakhさん

0054デフォルトの名無しさん2017/01/22(日) 21:43:58.70 ID:LUcM/+lo
>>50
他の言語なら、いらなくなった変数にnullを代入することがスペースリークの解決策

nullを代入することには問題があるというイメージだったが
むしろ解決策じゃね?というイメージに最近変わった
その変化に貢献したのがHaskellだった

0055デフォルトの名無しさん2017/01/22(日) 22:35:32.21 ID:KAhPA/LR
>>50
あなたは何を以てスペースリークが解決されたと見なしてるの?
スペースリークを気にする必要がなくなった=解決なの?
もしそうなら、そんな未来は来ないと思う。

遅延評価を採用している以上、スペースリークは絶対に気にしなければならない。
あるヒープ領域がスペースリークなのかどうか、ランタイムシステムには判断できないんだから。

スペースリークなのかどうかがもっと調べやすくなる未来は来ると思うけどね。

0056デフォルトの名無しさん2017/01/22(日) 23:37:17.44 ID:LUcM/+lo
これに関しては遅延評価でも並列処理でも同じこと
処理が終わったらメモリ解放されるが途中で止まったら解放されない問題

0057デフォルトの名無しさん2017/01/23(月) 08:47:48.02 ID:z+XsKe69
昨日の50だけど具体的には
n=1000とか先頭で決め打ちしといてコード書くのは大丈夫でも
上限を与えられるようにするとリークするので大きなnを与えられなかったり
配列の読み書きのコードを逐一doブロックに書くのはokだったけど
<<=を使って書いたらスペースリークしたこともあるし
いちいちこれはリークするのかとか考えながらコードはかけないなと思った
haskellでproject euler 200問弱といたけどその間に思ったことだよ
えっこれがリーク?みたいなのがある

>>55
明確なスペースリーク対策のガイドラインができたらかなぁ

>>54
俺はあれはクソコードが、と思ってた
javaならweakreferenceを使うという手があって
だから最近のapiは進歩しててandroidならsetBackgroundDrawableが非推奨になって
setBackgroundをつかえみたいになってるnull代入しなくてよくなってるような

0058デフォルトの名無しさん2017/01/23(月) 10:43:46.71 ID:txYt6xvX
>>57
project euler の何番がスペースリークのせいで解きにくかったか思い出せる?
こっちでも検証してみたい。

思い出せないのなら、1番から順にやってみるけど。

0059デフォルトの名無しさん2017/01/23(月) 11:25:17.95 ID:z+XsKe69
>>58
さすがにそこまでは覚えてないけど後半はコードにスペースリークがあると
すぐセグメンテーションフォルトする
序盤の問題は時間もスペースも気にせず簡単に解ける問題が多いので
その目的なら100番ぐらいから始めた方がいいよ
1番からだとさくさく進んで楽しいけどね

0060デフォルトの名無しさん2017/01/23(月) 12:27:38.51 ID:txYt6xvX
>>59
分かった。
100番以降で、かつサイズが決め打ちできないものをやってみる。

0061デフォルトの名無しさん2017/01/23(月) 21:52:59.71 ID:Wt4rS9Jl
Project Eulerでの答えを求めるのには十分でも
HackerRankのProject Euler+の同じ問題でTLEしたりしたことある

0062デフォルトの名無しさん2017/01/23(月) 22:38:43.36 ID:ibzQibs1
say :: Show s => s -> IO ()
say s = “Say, ++ show s ++ “!!”

print 1234
=> Say, 1234!!

print “Haskell”
=> Say, “Haskell”!!

ああああああああ!!!(ブリブリブリブリュリュリュリュ!!!ブッチチブブブチチチブリリリブブブゥゥゥゥッッッ!!!)

0063デフォルトの名無しさん2017/01/24(火) 00:13:24.79 ID:MMtIoejY
Showがどういう意図のものか理解してないで使ってるって話?

http://melpon.org/wandbox/permlink/qMLLG4dQGoOHcKXe

0064デフォルトの名無しさん2017/01/24(火) 11:43:31.36 ID:OsDnSY6Y
showをユーザー定義する権利を与える代わりに「正しい」定義を決める義務がなくなる
というwinwinの関係

0065デフォルトの名無しさん2017/01/24(火) 11:53:28.57 ID:GCEfrzc1
法則を満たしてるか静的にチェックする機構をコンパイラに実装することは理論上

@不可能
A可能(だが現実には困難)
B可能(で鋭意開発中)
C

0066デフォルトの名無しさん2017/01/24(火) 12:06:44.09 ID:OsDnSY6Y
法則ではなくユーザーの自由意志です

0067デフォルトの名無しさん2017/01/25(水) 07:07:08.08 ID:sKR8yojt
instance Show [Char] と書く方法の他に
instance Show Char の中で showList を定義するという方法もある

0068デフォルトの名無しさん2017/01/26(木) 08:50:54.03 ID:lcTQYluv
最近Haskellの勉強を始めたのですが、
["aa", "bb", f ["cc", "dd"] ] =
["aa", "bb", "cc", "dd"]
となるような関数fはどのように書けるでしょうか
もしくはそのような既存の関数はありますか

0069デフォルトの名無しさん2017/01/26(木) 11:12:47.33 ID:CzfVK0w5
>>68 型が合わないのでかけないと思う

0070デフォルトの名無しさん2017/01/26(木) 13:24:39.66 ID:lcTQYluv
>>69
やはり書けませんか…
ありがとうございます

0071デフォルトの名無しさん2017/01/26(木) 16:38:08.74 ID:2yUJ7U50
普通に++での結合じゃアカンのか?

0072デフォルトの名無しさん2017/01/26(木) 16:46:28.90 ID:+E0dl1ly
たぶんその前の時点でアプローチがHaskellのやり方じゃないんだろう

0073デフォルトの名無しさん2017/01/26(木) 17:04:34.61 ID:CzfVK0w5
スタック型言語なら直接68のやり方は可能だと思う

0074デフォルトの名無しさん2017/01/26(木) 17:09:08.58 ID:gPJK2FxR
アンパックしたいのか

0075デフォルトの名無しさん2017/01/26(木) 17:18:35.09 ID:MclODevV
どういう文脈でそれをしたくなったのか説明してくれれば
うまい代替案が出てくるかもよ

0076デフォルトの名無しさん2017/01/26(木) 17:36:01.96 ID:9y5sHdOj
文脈は知らないが応用問題を作ればなんとなくわかる

length ["aa", "bb", f xs]
の値がコンパイル時に定数になることを証明せよ
または定数にならないような関数fを書け

0077デフォルトの名無しさん2017/01/26(木) 20:00:55.44 ID:XEk5YWy9
>>76
応用つか全然違う問題じゃないか

0078デフォルトの名無しさん2017/01/26(木) 21:43:31.09 ID:q6lSzUEJ
68です
単なる興味本位で出来ないものかと頭を捻らせていたもので

0079デフォルトの名無しさん2017/01/27(金) 06:04:37.64 ID:gELNspyu
うーん
そもそも、それ許すとバグの温床になるからこその型だしねぇ。。。

0080デフォルトの名無しさん2017/01/27(金) 07:51:28.34 ID:6/LCWfy+
Cのプリプロセッサというのを使うというのはどうだろう

0081デフォルトの名無しさん2017/01/27(金) 08:14:39.10 ID:Gw4smznt
["a","b"] ++ (id ["c","d"])
あかんの?

0082デフォルトの名無しさん2017/01/27(金) 08:53:18.21 ID:3bNTd4fp
それを許すと何も面白くない駄作の温床になるからね

0083デフォルトの名無しさん2017/01/28(土) 01:14:43.56 ID:fSWa9KDr
Template Haskellの話題ではないのか

0084デフォルトの名無しさん2017/01/28(土) 03:42:22.11 ID:IY+AilYG
haskellだと簡潔に書けるので
-shared で .dll(in windows), .so(in linux) を作って使っているのですが、
import Data.Text (or Data.List.Split.Internals)等で関数を書くと
.hsのコンパイルはいけるんですが
-shared の時に

0085デフォルトの名無しさん2017/01/28(土) 03:43:06.88 ID:IY+AilYG
定義されていない参照です, とエラーが出ます。
取り敢えず自分で関数書いてるので問題は無いのですが、haskellの勉強も兼ねて解消したいです。
どなたか教えて頂けないでしょうか

0086デフォルトの名無しさん2017/01/28(土) 05:34:16.63 ID:vo7t9bEK
FTPだっけ。あれどうなったか知ってる人いる?
length (4,2) == 1
になっちゃうやつ。

0087デフォルトの名無しさん2017/01/28(土) 09:59:41.44 ID:9bw7znio
path パッケージの Path.parseRelDir 関数で、引数に "." や "../" が指定できないのは何故?

"." や "../" って相対パスちゃうの?

0088デフォルトの名無しさん2017/01/28(土) 10:15:30.83 ID:fSWa9KDr
> "." や "../" って相対パスちゃうの?

カレントディレクトリからの相対パスだが
そのpathパッケージとやらはカレントディレクトリを認識してるのか?

0089デフォルトの名無しさん2017/01/28(土) 16:29:13.45 ID:1e+Xw+ps
重城良国
Haskell 教養としての関数型プログラミング


Richard Bird 他1名
Haskellによる関数プログラミングの思考法


Haskell本が今度二冊も出るみたいですね

0090デフォルトの名無しさん2017/01/28(土) 20:17:03.76 ID:9bw7znio
>>88
「カレントディレクトリを認識する」ってのがどういう意味なのか分からんのだが。

たとえば filepath パッケージに System.FilePath があるけど、
こっちのはカレントディレクトリを認識してるって言えるの?

0091デフォルトの名無しさん2017/01/29(日) 00:01:01.66 ID:fPEtEvtP
>>87
なんかissueで普通ノーマライズするから不要で、そういうルールだとか言ってるが
その割に/をハードコードしてたり
言ってる意味不明だから使わない方がいいぞこれ

0092デフォルトの名無しさん2017/01/29(日) 08:43:35.35 ID:INpmjvgO
>>91
path パッケージのラッパーになってる path-io パッケージは良さそうなんだが、
path の方がそんなんでは、どうもな・・・

アドバイスありがと、止めておくよ。

0093デフォルトの名無しさん2017/01/29(日) 08:52:55.32 ID:W0xWcefq
foldrと同じ働きの関数foldr'は

foldr' :: (a -> b -> b) -> b -> [a] -> b
foldr' f v [] = v
foldr' f v (x:xs) = f x (myFoldr f v xs)

で定義できますが、:tで調べるとPreludeのfoldrの型は

foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

になってます。
foldr'の型宣言を同様に修正するとエラーが出ます。
エラーが出なくするために二行目の空リスト[]を
どう修正したら良いのか分からんとです。

0094デフォルトの名無しさん2017/01/29(日) 08:55:53.89 ID:W0xWcefq
訂正
上の myFoldr は foldr' の間違いです。

0095デフォルトの名無しさん2017/01/29(日) 09:16:54.72 ID:OhLobWwB

0096デフォルトの名無しさん2017/01/29(日) 13:55:23.65 ID:/KLkodo+
Foldableは単にfoldr出来ますよーってだけの型クラスだから
リストなどのインスタンスを持ってこないと具体的には定義できない
(==) :: Eq a => a -> a -> Bool
だけでは定義しようがないのと同じ

0097デフォルトの名無しさん2017/01/29(日) 15:59:36.88 ID:ExFk7aPU
FTPはとっくに取り入れられてた。base 4.8.0から。気付かんかったわ

0098デフォルトの名無しさん2017/02/01(水) 13:32:39.96 ID:53XrODAY
stackアップデートできねえぞ
atomでエラーでたぞ
ghciってなんでデフォルト一行なの
勉強用なの?ふつうつかわないの?
atomとそのコマンド、パッケージ選び
Gitって初心者なのに入れるの?
ないとターミナルいれられないんだが
ああめんどい
コマンドプロンプト見にくい
フォントきもい
ターミナル必要なのか
ビルゲイツしね
ターミナルってのないとエディタからコンパイルできないの?
コンパイルなし実行できないの?
ライブラリとはなにか、どこにあるのか
アトムから読めんのか
ライブラリよんで勉強するもんなのか
Windowsのディレクトリなにこれ
ユーザー名フォルダの場所とか意味不明
パスってなに、パスの通し方
こんなんググらせんなよ
よくこんなの考えやがったな

やること多すぎ 時間かかりすぎ
おぼえたくない 時間のムダ
技術じゃなくて雑学だな
自動化しとけまとめとけクソクソうんこ
それでもプログラマか
啓蒙する気ゼロだなほんと

0099デフォルトの名無しさん2017/02/01(水) 13:51:05.42 ID:53XrODAY
オブジェクトファイルとインターフェースファイルのこともちゃんとまえもって教えないとダメでしょ
qiitaとか入門云々とかはてなブログとかほんと死ねばいいのよ
なんでもかんでも初心者にググらせてんじゃないよ!

0100デフォルトの名無しさん2017/02/01(水) 16:06:50.00 ID:Iw+tyvVU
コンパイラは難しい
昔の古いインタプリタは簡単だった
確率は1/2じゃなくて実際は9割以上が難解な方を選ぶんだろう

0101デフォルトの名無しさん2017/02/01(水) 17:56:57.37 ID:UXwydrfk
またワードサラダボットが稼働を始めたか

0102デフォルトの名無しさん2017/02/01(水) 18:22:05.14 ID:C6fGSB5S
初心者じゃなくなってもなんでもかんでもググってる俺
カン拡張って何?ふむふむわからん

0103デフォルトの名無しさん2017/02/01(水) 18:27:07.04 ID:v0ndbkEe
Kan拡張?
聞いた瞬間分かるわ圏論由来ってwww
圏論の本読め

0104デフォルトの名無しさん2017/02/01(水) 19:57:57.60 ID:M7LFtYkC
リンシャンカイホウ?

0105デフォルトの名無しさん2017/02/01(水) 20:05:04.51 ID:Iw+tyvVU
紙の本がなくなったら本を読むのもインストールで挫折する時代が来るかも

0106デフォルトの名無しさん2017/02/04(土) 23:20:45.84 ID:9/lBQk1n
俺の部屋にはインストールで挫折した本が積み重なっている

0107デフォルトの名無しさん2017/02/05(日) 14:17:32.23 ID:TDpThq2o
ネタバレはズルという思想があるよね
タダで教えてもらえるネタバレを全部理解してから本を買うという発想ができない

0108デフォルトの名無しさん2017/02/05(日) 22:41:58.34 ID:TdsB4n5F
FIT(Framework for Integrated Test)
http://fit.c2.com/

これの Haskell 実装にチャレンジしてる人いる?
そんな人のブログやHP知らない?

試しに GitHub を探してみたけど、見当たらない感じ。

0109デフォルトの名無しさん2017/02/05(日) 22:42:57.06 ID:Whb3/S6q
俺も龍を捨てて玉を詰むという勇気が出ない

0110デフォルトの名無しさん2017/02/06(月) 12:52:47.67 ID:Ld2MqDtI
Haskell objectiveってどうなったの?
やっぱダメだった?

0111デフォルトの名無しさん2017/02/06(月) 14:32:11.26 ID:CcXtgB5F
>>110
これか?

https://hackage.haskell.org/package/objective

Haskell objectiveでググると最初に出てくる

0112デフォルトの名無しさん2017/02/06(月) 14:44:23.19 ID:Ld2MqDtI
使いやすさ的にどうだったのかなって。
作ったの日本人っぽいけど

0113デフォルトの名無しさん2017/02/06(月) 15:50:30.09 ID:CcXtgB5F
>>111

Haskellでの合成可能なオブジェクトの構成とその応用
https://fumieval.github.io/papers/ja/2015-Haskell-objects.pdf
>この章では、本稿で提案するオブジェクトの定義やその性質について説明する。なお、これから
>示すオブジェクトや関連する構造は、公開している objective パッケージ 1 に格納されている。

> 1 http://hackage.haskell.org/package/objective

0114デフォルトの名無しさん2017/02/08(水) 01:03:40.92 ID:E7OnquDd
functor分からんとHaskellは使えないの?

0115デフォルトの名無しさん2017/02/08(水) 03:27:27.73 ID:lPz/aekC
凄いHを一通りやって、今はReal world haskellやってる途中
設計関連がまだよく分かってないな
モナド変換子とか非同期関連もよく分かってないや
関数型の勉強で始めたけど中々難しい
言語としては今の所簡潔で好きではある、ってか他言語の括弧がキモく見えてきた

0116デフォルトの名無しさん2017/02/08(水) 09:54:44.42 ID:8j/X+nWQ
オフサイドルールには賛否両論ある

0117デフォルトの名無しさん2017/02/09(木) 04:29:48.20 ID:SonJzAjc
>>114
んな事ない。
と言うか、昔はファンクタ自体無かった。
モナドあるならファンクタも入れろや的な。
モナドも、使うぶんにはいつの間にか使ってる感じ。

モナドとは何か?とか考えると難しいけど、まあモナドもファンクタも型の一種。
そう言う特性の関数や演算子を使うための。
言わば、処理の流れにも型があるとでも思ってくれ。

0118デフォルトの名無しさん2017/02/09(木) 08:20:37.05 ID:CYxwUQWJ
>>114
実際的に重要なのはFunctorというよりも(そのインターフェースの)fmapの理解かな
多分よく出会うのはListのmapだけど、まずはこいつを使いこなせるようになれば
Haskellらしい、関数型らしい書き方ができるようになってくると思う

0119デフォルトの名無しさん2017/02/09(木) 08:31:16.17 ID:/fB7Lbok
fmapとmapの名付けは解せない

0120デフォルトの名無しさん2017/02/09(木) 08:58:32.86 ID:UTxumv29
モナド則は
型と関数と関数合成が満たすべきルール。
ただし自作モナドがモナド則を満たすことを保証する機構はない。

0121デフォルトの名無しさん2017/02/10(金) 15:45:40.33 ID:5JASqTbe
fromIntegralに短縮名つけるのが癖の人っている?
fI = fromIntegral 的な

0122デフォルトの名無しさん2017/02/10(金) 18:50:22.57 ID:xMx0FpSS
長くなるならletで別行で定義する

0123デフォルトの名無しさん2017/02/11(土) 23:22:07.65 ID:8gjNJV43
メッセージングシステムを主なアーキテクチャとしているアプリケーションにおいて、
そのメッセージの種類を増やすことでアプリケーションの機能を拡張する際に、
コンパイルすべきモジュールの数を最小限に抑える方法を探しています。

メッセージングシステムというと大げさかもしれませんが、
たとえば Win32API のウィンドウメッセージのようなものを想像してください。

モジュールAとモジュールM、およびモジュールTがあるとします。
モジュールTの中ではMsg型が定義されいます。

data Msg = MsgX String Int | MsgY [Double]

また、モジュールTはモジュールAとモジュールMの両方からインポートされています。

モジュールMの関数はモジュールAの関数を呼び、モジュールAの関数は型Msgの値を返します。
モジュールMの関数はMsgXが帰ってきた場合と、MsgYが帰ってきた場合とでその後の処理を変えています。

ここで、このアプリケーション機能を拡張しようと、Msg型にデータコンストラクタMsgZを追加しました。
そして、MsgZを返す関数を持つモジュールBを新たに作りました(もちろんモジュールTをインポートしています)。

ただし、既存のモジュールAは何も変更していません。

しかしそれでも、これをビルドする際にはモジュールAの再コンパイルが必要です。
インポートしている、つまり依存しているモジュールTが更新されたからです。

このような単純なメッセージングシステムの作りだと、どうしてもアプリケーションを拡張する際にモジュールTの更新が伴い、
それによって、変更していない多くのモジュールの再コンパイルが必要になります。

かといって極端な話、メッセージや付随するデータを ByteString 型にシリアライズすれば再コンパイルの問題は解決しますが、
今度は型の不一致や未定義メッセージなどのバグがコンパイル時に発見できなくなり、それもマズいです。

厳格な型システムの恩恵にあずかりながら、かつ不要な再コンパイルを抑えるようなメッセージングシステムの構築方法はないでしょうか。

0124デフォルトの名無しさん2017/02/12(日) 13:50:57.94 ID:EOfitV0o
javaですら良く分からんやつに
haskellのモナドなど分かるはずも無く

0125デフォルトの名無しさん2017/02/12(日) 15:45:54.11 ID:+1FsHT8L
ポインタ理解するときもモナド理解するときも小1で自転車補助輪外す時もみんな同じ感覚だった気がする
学習は滴定曲線のように、『気づいたら知って』いた

0126デフォルトの名無しさん2017/02/12(日) 16:10:07.24 ID:QGOwrBDz
たいていの概念は名前も説明も勿体つけてるが実はたいしたことはない
さらに最悪なのは長々と理屈ついている割に扱いは他の概念と変わらないやつだ
そういうのを世間では屁理屈という

0127デフォルトの名無しさん2017/02/12(日) 17:52:39.61 ID:C9OkM4dT
西尾維新批判はやめろ

0128デフォルトの名無しさん2017/02/12(日) 21:33:24.01 ID:hoDvKKnX
アベノミクスとか新常態とかもそうだよね

0129デフォルトの名無しさん2017/02/12(日) 22:25:13.91 ID:cs8Gyxec
haskellの本が出るみたいだから買ってみよう

0130デフォルトの名無しさん2017/02/12(日) 23:59:55.00 ID:t7tEKqZ9
>>89の二冊か

0131デフォルトの名無しさん2017/02/14(火) 00:10:05.79 ID:haBe4Sdm
お前らってこういうのチェックしてたりするの?

Haskell News
http://haskellnews.org/grouped

0132デフォルトの名無しさん2017/02/14(火) 07:07:04.56 ID:0/yLOI7Z
そもそもfoldはループより速い?

0133デフォルトの名無しさん2017/02/14(火) 10:36:57.61 ID:CVjuh2pk
>>132
Haskellにはループ構文はありません。
一体何と比較した話でしょうか?

0134デフォルトの名無しさん2017/02/14(火) 16:50:38.39 ID:m6BuE6wx
>>133
C

0135デフォルトの名無しさん2017/02/14(火) 21:33:40.60 ID:jOgsWiWm
>>134
Haskellの中で複数のアルゴリズムの比較はできますが、
C言語のforループとの速度の比較はできません。

0136デフォルトの名無しさん2017/02/14(火) 23:12:33.60 ID:Bh34MboJ
バイナリを吐かせて逆汗すれば比較できるんでないの?
つっても多くの関数呼び出しはインライン展開されるんだろうが

0137デフォルトの名無しさん2017/02/15(水) 05:29:57.20 ID:De10g5Ib
>>132
データ構造やコンパイラによる。
Haskellは基本リストなのでアドレスが連続してるとは限らない。
Cだと同じ処理を配列に施す様なループはSIMD命令に変換される。
Haskellはそう言う命令に変換する為のデータ構造使う。
(データの連続性を保証するためにもデータ構造が別なのだと思う)

IntelC++コンパイラとかだと最新のSIMD命令に対応してる。
gcc程度まではHaskellでも書き方次第では追い付けるだろうけど、CPUメーカー謹製の最新CPU対応コンパイラにまでは勝てない。

入門書レベルではHaskellはCに勝てないけど、いかなる並列・並行処理も否定してない。

0138デフォルトの名無しさん2017/02/15(水) 06:42:21.88 ID:+7DpWr8H
そもそもHaskellのfoldとCのforループとでは、
速度を比較するための条件をそろえる事ができません。

たとえばプロセスを立ち上げてから処理し終えるまでの時間、
このレベルであればHaskellとCの比較に意味はあります。
実行環境という条件を同一にできるからです。
(ちなみに、この場合はCの方をHaskellより速くすることができます)

一方HaskellのfoldとCのforというレベルでは、まず計算するために入力するデータが違います。
foldの入力データ型はリスト(Foldableのインスタンス)ですが、同じものをCで再現できますか?
入力データをそろえなければ「関数程度のレベルの比較」に意味はありません。

0139デフォルトの名無しさん2017/02/15(水) 07:03:08.40 ID:mu4JLPUi
扱うモナドがファンクタのとき
return . f =<< m

f <$> m
とシンプルに置き換え可能なのですね

0140デフォルトの名無しさん2017/02/15(水) 10:15:38.52 ID:JnBGC/9x
何年か様子見してたけどやっぱり流行らんな
難しいから底辺には普及しないはわかるが
だったら上位の連中は食いつくかと言えばそんなことはなかった

0141デフォルトの名無しさん2017/02/15(水) 11:05:35.10 ID:3lGP54OB
難いのに普及したC

0142デフォルトの名無しさん2017/02/15(水) 11:41:14.45 ID:1S7+uRG8
C以前の言語がひどすぎたんだ

0143デフォルトの名無しさん2017/02/15(水) 13:18:52.67 ID:jktpXUxB
えっ、Modula-2とかCより読み易くて
低レベルのシステム記述も出来たのに
全然普及せんかったでw

政治的理由と思うが突然Turbo Modula-2
の販売が中止になってTurbo-C出たけどね。

0144デフォルトの名無しさん2017/02/15(水) 17:36:32.27 ID:kkhdLQ6B
出た! 陰謀論!

0145デフォルトの名無しさん2017/02/16(木) 00:44:11.97 ID:PsfAYoHu
流行り廃りに合理的な理由なんてない。

0146デフォルトの名無しさん2017/02/16(木) 04:02:18.89 ID:zxmzXW5F
普及言語からHaskellに乗り換えに難しく感じる部分

・do記法は関数で構成されるという関数型プログラミングの理解のための学習の邪魔をする(混乱させる)
・型を気にせず書けるスクリプト言語からだと強力すぎる型推論のおかげで型があるという感覚になじめず型に関するエラーでイラ立つ
・C言語系からだとreturnがreturn構文じゃない、if-elseが式である
・イミュータブルしかない、再代入が出来ない、(ように感じ)思うようにコード書けず辛い
・Haskellについて語る書の書き方や視点が数学寄りのものが多く理解が難しい(奴らが言うようなこまけえ数学っぽいこと気にせんでもコードは書けるっちゅうに純粋さにこだわりすぎ)

0147デフォルトの名無しさん2017/02/16(木) 15:22:31.85 ID:VWTLMYuE
そもそもハスケルの強みって何?
計算時間ではビジュアルスタジオに遠く及ばないだろ?
描画とか数学的処理も他の高級言語使った方がよくね?

0148デフォルトの名無しさん2017/02/16(木) 16:47:16.10 ID:fRybmYDX
仕様記述言語の強み
自分が強くなるために右往左往するよりも
強くなりたいならああしろこうしろと指図して右往左往させる側

0149デフォルトの名無しさん2017/02/16(木) 18:17:34.39 ID:VWTLMYuE
右往左往の意味がよく分からんが、自分が考えて手を動かす量が減るということかな?

0150デフォルトの名無しさん2017/02/16(木) 19:16:01.32 ID:9Ohg+UxU
Haskellでゲーム作りたいです!

0151デフォルトの名無しさん2017/02/16(木) 20:28:16.21 ID:qwVWj3LU
言語仕様はともかく実行環境がおそ松すぎる

0152デフォルトの名無しさん2017/02/16(木) 21:04:48.77 ID:lgZA8NJM
>>151
どのような意味で言っているのかよく分かりません。
もう少し詳しく説明していただけないでしょうか。

0153デフォルトの名無しさん2017/02/17(金) 08:05:51.13 ID:nCBINic8
>>151
腐女子なの?

0154デフォルトの名無しさん2017/02/17(金) 08:37:50.87 ID:iKIs1hpk
遅いと言われようと、フィボナッチ数列をzipWithで1行で書ける言語というところに魅力を感じている
(そんなに何度もフィボナッチ数列を書く機会があるわけではないが表現力の一例として)

0155デフォルトの名無しさん2017/02/17(金) 10:28:30.13 ID:nCBINic8
1行フィボナッチって結構あるんだな全然知らなかった

https://wiki.haskell.org/The_Fibonacci_sequence

0156デフォルトの名無しさん2017/02/17(金) 13:55:10.09 ID:gJ+iD/w/
パスカルの三角形を出したいんだけど、
++使ってるのが気に食わないのだがうまく消せなかった
import Data.List (unfoldr)
pastri :: [[Int]]
pastri = unfoldr (\l -> Just (l, body l)) [1]
    where
      body xs = 1 : zipWith (+) xs (tail xs) ++ [1]
main = mapM_ print $ take 15 pastri

0157デフォルトの名無しさん2017/02/17(金) 19:08:56.34 ID:ishbEDrB
型に関数型のデータを持たせることはできますか?
GHC.TypeLitsで自然数型のデータをもたせることは出来ましたがどうやら関数型は無いようです
ニュアンスとしては以下のような事をやりたいです
newtypeでaを定義し直しMonoidのインスタンスにすれば同じ処理は出来ますが
冗長性を省いてシンプルに記述したいです

newtype Hoge (f :: a->a->a) (a :: *) = Hoge a deriving Show

instance (Num a) => Monoid (Hoge f a) where
mempty = Hoge 0
(Hoge x) `mappend` (Hoge y) = Hoge (f x y)

0158デフォルトの名無しさん2017/02/17(金) 20:56:35.22 ID:BpdtDTW+
data Hoge a = Hoge (a -> a -> a) a
これだとHoge f 0とHoge g 0の型は同じになってしまう
引数fをgに変えると戻り値の型が変わるような関数Hogeは動的言語なら作れるかも

0159デフォルトの名無しさん2017/02/17(金) 21:34:57.67 ID:WL7YVLDK
>>156
長さが異なるリスト同士の zipWith で、短い方の末尾をデフォルト値で補って長さを揃える、
そんな関数 zipWith' を作ってはどうでしょうか。

zipWith' :: (a -> a -> a) -> a -> [a] -> [a] -> [a]
zipWith' _ _ [] [] = []
zipWith' f d [] (y:ys) = f d y : zipWith' f d [] ys
zipWith' f d (x:xs) [] = f x d : zipWith' f d xs []
zipWith' f d (x:xs) (y:ys) = f x y : zipWith' f d xs ys

これを使えば、例えば [1, 3, 3, 1] から [1, 4, 6, 4, 1] は次のようにして作れます。

let xs = [1, 3, 3, 1]
zipWith' (+) 0 xs (0 : xs)

この関数は一方だけでも無限リストだと止まらないので注意が必要ですが、
ときどき役に立つので私は自分のツールボックスに入れています。

0160デフォルトの名無しさん2017/02/17(金) 22:22:44.78 ID:nCBINic8
パスカルの三角形はロゼッタコードにあるのが限界でしょ

Pascal's triangle - Rosetta Code
https://rosettacode.org/wiki/Pascal%27s_triangle#Haskell

0161デフォルトの名無しさん2017/02/18(土) 01:35:58.15 ID:4ADoOqjk
>>156
以前にこんなのを書いたことがある
pascal :: (Integral a) => [[a]]
pascal = map (1:) $ (:) (repeat 0) $ zipWith (zipWith (+)) pascal $ map tail pascal

-- pascal =>
[
[1,0,0,..],
[1,1,0,0,..],
[1,2,1,0,0,..],
[1,3,3,1,0,0,..],
..
]

2重リストなんで見た目複雑だけど発想としては
fib = 0:1: zipWith (+) fib (tail fib)
とほぼ同じ

0162デフォルトの名無しさん2017/02/18(土) 12:34:28.15 ID:OQ3VgdS2
++をネタにする作者の気持ちをスルーしてパスカルの三角形を熱く語る
理系の鑑

0163デフォルトの名無しさん2017/02/19(日) 07:14:56.06 ID:rxEXn9HF
pascal = map (takeWhile (/= 0)) $ iterate (\xs -> 1 : zipWith (+) xs (tail xs)) (1 : repeat 0)

http://melpon.org/wandbox/permlink/HLKtAXzGodOF3ZGP

0164デフォルトの名無しさん2017/02/19(日) 10:09:57.42 ID:obWbRffz
ところで・・・

コメントを読まなくても、どのように計算しているのかがぱっと見て分かる、
それが関数型が持つ高い宣言性の良いところ。

また、そのようにプログラムしても、もともとGHCが持つ優秀な最適化能力や、
プログラムの見た目を壊すことなく最適化を促すことができる仕組みのおかげで、
結果的にかなり効率の良い処理がなされる実行ファイルが出力される。
(実用的なアプリケーションで十分に耐えられる)

にも関わらず、そのメリットをあえて潰すようなプログラムをする人が稀にいるが、
純粋関数型のHaskellを使っておきながら、他に優先すべき事項があるのだろうか。

まぁ、縛りパズルをして遊んでいるのなら分かるが。

0165デフォルトの名無しさん2017/02/19(日) 11:37:29.74 ID:TYcfVj75
今ここで言う必要のないものを必要と思い込むことも縛りのパターンの一つ

0166デフォルトの名無しさん2017/02/19(日) 18:51:42.32 ID:rxEXn9HF
どうしても難解になりがちはワンライナーやコードゴルフで遊ぶのは人の自由だと思うけど遊び以外で使うのはたしかにどうかと思う

0167デフォルトの名無しさん2017/02/19(日) 19:20:27.12 ID:Mzz/1Hry
ポイントフリー教も1変数のパイプみたいなやつならまだ分かるのだが
(中間変数が無くなるから効率が上がるという話もある、
そのくらいGHCが最適化してくれてもよさそうなのに)
2変数以上になると完全に暗号めいてて困る

0168デフォルトの名無しさん2017/02/19(日) 20:52:17.90 ID:TYcfVj75
xss = (1 : repeat 0) : [ zipWith (+) (0 : xs) xs | xs <- xss ]
pascal = [ takeWhile (/=0) xs | xs <- xss ]

これは2変数というか2重ループ
それと再帰のために自分自身に名前をつけた時点でポイントフリーは諦めている筈

0169デフォルトの名無しさん2017/02/19(日) 23:43:55.15 ID:rxEXn9HF
ポイントフリーって何?こういうこと?

pascal = map (takeWhile (/= 0)) $ iterate ((1 :) . map sum . transpose . take 2 . tails) (1 : repeat 0)

http://melpon.org/wandbox/permlink/bYSi5tfNVy5zfzPg

0170デフォルトの名無しさん2017/02/20(月) 00:18:45.73 ID:mtupkOQi
変数名かんがえたくないときポイフリできたらしちゃうことある

0171デフォルトの名無しさん2017/02/20(月) 00:20:11.39 ID:bFWxmJHr
ArrowLoopの解釈はこれで合ってるの?

http://tamae.2ch.net/test/read.cgi/dame/1439747269/241-242n

0172デフォルトの名無しさん2017/02/20(月) 20:56:54.49 ID:uIdMc98M
ArrowLoopがどういうインターフェイスなのかいまいちよく分からないけど
その定義でどう動くかはfによるとしか・・・

0173デフォルトの名無しさん2017/02/20(月) 22:57:03.60 ID:tib6qfwe
結局ハードウェアの動きとあまりに乖離しすぎてるってのが
普及しない理由じゃないかと。

0174デフォルトの名無しさん2017/02/21(火) 04:45:41.06 ID:bkUsfADx
量子コンピュータが普及する時は言語どうなるんかな
CPUに合わせた新しい言語になるのか、今の言語をベースにコンパイラに任せるのか
原理とか全く知らなくて言ってるけど

0175デフォルトの名無しさん2017/02/21(火) 11:55:34.70 ID:hz5m2IGZ
メモリとCPUが分離しすぎているおかげでメモリ上のデータ構造に変化がない
OOPははそこを変えようとしたのか
分離するのやめれば破壊的イノベーションが起きるのではと

0176デフォルトの名無しさん2017/02/21(火) 19:46:11.18 ID:CLRDv6M0
ほんとぉ?

0177デフォルトの名無しさん2017/02/21(火) 22:11:08.30 ID:3rYbm5Zu
golangはOOPとは違うような

0178デフォルトの名無しさん2017/02/22(水) 01:32:49.98 ID:doFig/5A
tanakh神って色々とやられておられるのですね

http://hackage.haskell.org/user/HideyukiTanaka

0179デフォルトの名無しさん2017/02/22(水) 11:25:20.39 ID:C8G0Nbdq
ContrainedなFunctorを実装していて直面した問題です
問題の本質を以下の単純化したコードで例示します
最後2つのインスタンス宣言の間で"Duplicate instance declarations" エラーが発生してしまいます
これは型aがOldAとUsefulFoo両方のクラスのインスタンスである場合どちらのnewHogeを実行すればいいのか区別がつかないからですが
実用上このケースは無意味で意図してコードを書かなければ起こり得ません
OldAとUsefulFooの両方のインスタンスになるような型が存在しないことをghcに伝えられればエラーにしなくても良いと思うのですがそのようなテクニックや言語拡張はあるのでしょうか

{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}

class OldA a where
hoge :: a -> a

class NewA a where
newHoge :: a -> a

class UsefulFoo a where
us :: a -> a
ef :: a -> a
ul :: a -> a

instance OldA a => NewA a where
newHoge = hoge

instance UsefulFoo a => NewA a where
newHoge = us . ef . ul

0180デフォルトの名無しさん2017/02/23(木) 00:49:33.52 ID:9wlFqT9C
諦メロン

0181デフォルトの名無しさん2017/02/23(木) 06:24:32.19 ID:1D9YdnQF
>>178
最近はRustに御執心の様子

0182デフォルトの名無しさん2017/02/24(金) 02:19:21.58 ID:bZ+UJBqj
>>179
OldAとUsefulFooとNewAの設計方針が間違っていたのでは?

0183デフォルトの名無しさん2017/02/24(金) 11:52:40.03 ID:e/BP7pNw
最新のGHCは簡単な余再帰が末尾再帰に変換されて最適化かかるの?

0184デフォルトの名無しさん2017/02/25(土) 01:04:24.08 ID:wcM+rtIC

0185デフォルトの名無しさん2017/02/25(土) 06:14:09.47 ID:rUogqkUr
これがアスペか

0186デフォルトの名無しさん2017/02/25(土) 06:24:01.20 ID:E4CT8R9/
fib_mem :: Int -> Integer
fib_mem = (map fib [0..] !!)
 where
  fib 0 = 1
  fib 1 = 1
  fib n = fib_mem (n-2) + fib_mem (n-1)
https://www.packtpub.com/mapt/book/Application%20Development/9781786464217/1/ch01lvl1sec09/Memoization+and+CAFs

フィボナッチは前スレのこれが美しすぎた。
これを見た後では
zipWithのフィボナッチとか完全に霞んで見える。

0187デフォルトの名無しさん2017/02/25(土) 11:33:38.62 ID:J8MTJSeU
数式に近いから美しいって言ってるのかもしれないけど
それは
fib_mem :: Int -> Integer
fib_mem x = _fibs !! x
_fibs = map _fib [0..]
_fib 0 = 1
_fib 1 = 1
_fib n = fib_mem (n-2) + fib_mem (n-1)
みたいに一時データがユニークになるって話だから
メモ化されるって言ってもO(n^2)だけどな

0188デフォルトの名無しさん2017/02/25(土) 12:20:37.16 ID:5RveVCtH
こんな所で感動しちゃってどうするの
そういうのは万策尽きて神頼みするような時だけいい
数学に感情は不要

0189デフォルトの名無しさん2017/02/25(土) 18:51:36.03 ID:A0aZ5Z9S
初歩的なメモ化で感動できた頃の心の輝きは大切にしていきたい

0190デフォルトの名無しさん2017/02/25(土) 18:58:12.64 ID:A0aZ5Z9S
メモ化してトップダウンするより足していってボトムアップの要領の良さが勝つ回

0191デフォルトの名無しさん2017/02/26(日) 22:44:13.60 ID:+sRU0DuI
stack new して作ったプロジェクトでライブラリを作りました。
(cabal ファイルに executable の代わりに library の項目を書いた)

stack build して正しくビルドされたことを確認してから stack install しました。

この後、別の stack new したプロジェクトで、先程 stack install したライブラリを使用するには、
どうすればよいのでしょうか。

0192デフォルトの名無しさん2017/02/27(月) 10:48:09.56 ID:TbO8J9W/
stack.yamlのpackagesから設定できるよ、stack installはしなくて良い https://docs.haskellstack.org/en/stable/yaml_configuration/

0193デフォルトの名無しさん2017/02/27(月) 22:42:50.07 ID:6zX/SjR0
>>192
出来ました。
ありがとうございました。

0194デフォルトの名無しさん2017/03/01(水) 13:33:54.14 ID:5kGyNHm4
諸君、議論したまえ

0195デフォルトの名無しさん2017/03/02(木) 08:35:24.25 ID:jHvj97KG

0196デフォルトの名無しさん2017/03/06(月) 19:44:44.66 ID:BYkqMHF2
新しく出たHaskell本の感想クレクレ

0197デフォルトの名無しさん2017/03/06(月) 20:21:59.21 ID:j+wBUtqM
前書きだけ立ち読みしたけど
あれ関数プログラミング入門を書き直したものなんだな

0198デフォルトの名無しさん2017/03/06(月) 20:28:33.59 ID:MHxEW6Wj
古い方持ってたら不要なのね

0199デフォルトの名無しさん2017/03/06(月) 23:01:20.41 ID:WL27y1mu
マジかよ危うく買うところだった

0200デフォルトの名無しさん2017/03/07(火) 00:14:37.81 ID:+xePePxn
かなり書き直してるよ

0201デフォルトの名無しさん2017/03/07(火) 10:44:02.94 ID:mr++RUpk
Bird氏の本の第三版か。
あの人、Functional Programmingの大御所なんだね。
すごいHやGraham氏、その他日本人著者の書いたのをいろいろ読んだけど、
コアな部分を理解するならBird氏の本だと思った。
翻訳第二版のファンシーな表紙をやめて、
原著の表紙の虎を持ってきたのは何かあったのだろうか?ww

0202デフォルトの名無しさん2017/03/07(火) 13:07:01.84 ID:H+HmLSCA
>>201
コアと言うのは、例えばどんな部分?

0203デフォルトの名無しさん2017/03/07(火) 13:38:15.87 ID:fYd9KAIw
と思ったらそもそも関数プログラミング入門買ってなかったのでこれを機会に買おう

0204デフォルトの名無しさん2017/03/07(火) 17:44:15.63 ID:rdG5C9r5
kinkyな表紙にしてくれ

0205デフォルトの名無しさん2017/03/07(火) 17:49:10.46 ID:mr++RUpk
>202
最初から正格、非正格を念頭に置いた上で議論が進んでいく。その時点で既に毛色が違う。
豆知識として、リスト内包表記とdo構文の<-の関係も載ってた。
証明問題が多く、数学がわかんないときつい感じ。

0206デフォルトの名無しさん2017/03/07(火) 20:23:58.44 ID:36OrCepo
>>205
あぁなるほど、そう言うのを一般に「コア」って言うのか

ありがと

0207デフォルトの名無しさん2017/03/08(水) 06:06:40.10 ID:XWjfITmE

0208デフォルトの名無しさん2017/03/08(水) 06:44:38.74 ID:KZ+JXzQR
今更すぎる
和訳で知ったのに原文貼って物知り顔するな

0209デフォルトの名無しさん2017/03/08(水) 12:31:57.39 ID:RBmx3E25
>>207
週末に人気のあるプログラミング言語(StackOverflow調べ)
https://developers.srad.jp/story/17/02/09/0354232/
週末にいちばん多く使われるプログラミング言語は?
http://postd.cc/what-programming-languages-weekends/

0210デフォルトの名無しさん2017/03/11(土) 21:23:14.84 ID:uo9d8gfu
Haskellにも依存型があと数年以内に組み込まれるらしいですが、使用目的は専ら型安全性を得るためなのでしょうか?

0211デフォルトの名無しさん2017/03/11(土) 23:30:29.33 ID:UHyrmxcZ
定理証明支援系はいつですか?

0212resumi2017/03/12(日) 01:08:56.73 ID:f0Kjw9v5
これ普通にショックだね。。
本当なの??
https://goo.gl/RB0asw

0213デフォルトの名無しさん2017/03/12(日) 01:54:17.97 ID:kqHBJY7y
見てないけどグロ

0214デフォルトの名無しさん2017/03/12(日) 22:59:29.77 ID:fpOKmvSG
最新のGHCだと余再帰が可能な限り自動で末尾再帰に変換されて最適化がかかるって聞いたんですけど本当すか?

0215デフォルトの名無しさん2017/03/13(月) 08:05:36.75 ID:0mFH2buk
tanakhに訊け

0216デフォルトの名無しさん2017/03/13(月) 10:55:02.44 ID:dlgNAjv1
tanakhとかうざ

0217デフォルトの名無しさん2017/03/14(火) 22:01:52.58 ID:EYcQAf3p
Data.Setをモナドにしたい場合はどうしてますか?
GADTsを使ったものと
https://wiki.cse.unsw.edu.au/cs4181/13s2/Schedule?action=AttachFile&do=get&target=thum460.pdf
type familyを使ったものと
https://hackage.haskell.org/package/constrained-categories-0.3.0.1/docs/Control-Monad-Constrained.html#g:1
もしくはそれ以外にも方法はあるのでしょうか

0218デフォルトの名無しさん2017/03/16(木) 21:36:03.95 ID:4z74DpyU
使う型がInt32なら32を、Int64なら64をコンパイル時に決定してソースコードに埋め込むメタプログラミングな関数を書くにはどうしますか?

0219デフォルトの名無しさん2017/03/16(木) 22:28:40.43 ID:4z74DpyU
Int に 対する read が遅くて困っています。
80万個のInt型をreadするのに、10^9付近の整数ばかりの場合と、1とか10とか小さな整数ばかりの場合とで 2 倍も処理時間が違ってきます。(2秒が4秒です!)
もっと速く読み込む方法はありませんか?
(但し標準入力からとします)

0220デフォルトの名無しさん2017/03/16(木) 23:18:00.86 ID:xmljzEMX
readInt

0221デフォルトの名無しさん2017/03/16(木) 23:20:30.52 ID:xmljzEMX
ByteStringのreadInt

0222デフォルトの名無しさん2017/03/16(木) 23:21:15.32 ID:xmljzEMX
readIntegerだった
うろ覚えだったすまん

0223デフォルトの名無しさん2017/03/17(金) 00:45:32.34 ID:gNJfFjGV

0224デフォルトの名無しさん2017/03/17(金) 00:46:54.92 ID:gNJfFjGV
これは全然メタじゃない

0225デフォルトの名無しさん2017/03/18(土) 18:18:35.73 ID:bH58Sv6/
>>221
ありがとうございます。10倍速く動くようになりました

0226デフォルトの名無しさん2017/03/18(土) 19:37:41.00 ID:bH58Sv6/
ひょっとして、foldl か foldl' かよりも、そこに渡す二項関数の方を正格にするか遅延のまま
かが速度に関わっているのでしょうか?

※二項関数は(+)やmaxのように単純であるとする

0227デフォルトの名無しさん2017/03/19(日) 04:00:42.66 ID:o/zGHEH2
ん、何言ってんだ。二項関数の問題じゃなくて二項関数に渡す『二つの引数が今すぐどちらも値まで評価されるかどうか』が問題なのか。
される場合、foldl'の方がサンクなしの省メモリ(定数空間?)で処理が進むのか。
foldl'で正格に評価するといってもWHNFで止まるんですもんね

サンクが要らないからその部分(サンクの作成と破棄)のオーバーヘッドがなくなってちょっとだけ速くなるのか。でもあくまで foldl' の利点は省メモリの方か

0228デフォルトの名無しさん2017/03/19(日) 10:06:06.54 ID:awlj00/Y
https://github.com/google/codeworld
http://code.world/

これに関する質問ってこのスレでいいの?

0229デフォルトの名無しさん2017/03/19(日) 10:30:10.95 ID:fNC16+Hl
速度の比較をしたいならまずプロファイルを取りなさい

0230デフォルトの名無しさん2017/03/19(日) 14:43:43.30 ID:qjqnp6Y8
V8エンジンで無茶苦茶速くなったことだし、もうTypeScriptでいいやと思うようになった。

0231デフォルトの名無しさん2017/03/20(月) 20:37:53.08 ID:H6ds3WUf
教えてください

何らかの型の巨大データがメモリ内にあったとして、データが用済みになった時に手動で解放する方法がHaskellにありますか?

そもそもそういう発想が間違いかも?

0232デフォルトの名無しさん2017/03/20(月) 22:25:28.88 ID:THpWaU1J
mark&sweepいらないなと思った時に参照カウントに変更する方法
言語を変えなくてもコンパイラを変えるだけでできそう(できたとは言ってない)

0233デフォルトの名無しさん2017/03/20(月) 22:42:41.03 ID:tOiVLltG
>>231
用済みになった時に手動で解放というのが、

1) たとえどこかから参照されていようが強制的に解放する
2) 参照がなく解放できる時にスケジューリングを待たずにGCを強制する

どちらの意味なのか分からん。

前者のつもりなら、たしか方法はなかったような気がする。
この発想は間違っていると思う。
自分が仕込んだメモリリークの問題を隠しているだけ。

後者なら、base パッケージの Systwm.Mem モジュールを調べてみて。
これなら分かる。
例えばゲームで、できるだけステージ途中で時間かかかるGCが起動しないように、
ステージ開始直前に強制的にGCさせたい、とか。

0234デフォルトの名無しさん2017/03/20(月) 22:58:59.79 ID:H6ds3WUf
>>233
ありがとう。質問してよかった。

こちらのイメージ的にはCで言うところのfreeで1)が近いと思うが、GCを強制する
発想がそもそもなかったです

断続的にでかいデータを扱うので、次のロードまでにメモリを解放しておく必要
がありまして。

Systwm.Memを調べてみます。

0235デフォルトの名無しさん2017/03/21(火) 07:16:46.72 ID:RPjo5BAn
演算子の部分適用の書き方で
演算子との間にスペースを書かないのはHaskellの作法?
(+ 3) (3 +) じゃなく (+3) (3+) って書くじゃんみんな

0236デフォルトの名無しさん2017/03/21(火) 09:36:45.55 ID:bH1u/9cj
みんなそうしてるから真似してそうしてるだけだろ。
わからないことは調べるのはめんどくさいから真似しておこうとか思ってそう。

0237デフォルトの名無しさん2017/03/21(火) 13:49:23.04 ID:L0SduR/f
>>235
普通に2項演算子として用いている場合は項と演算子とが独立してる感があるが、
部分適用した場合は「3を加える関数」という一塊の概念というイメージが強い
なんとなくだけどそんな使い分けではないかと思ってる

0238デフォルトの名無しさん2017/03/21(火) 13:55:43.06 ID:TPAad80u
GUIには等幅ではないフォントがあるから
1ピクセル単位でスペースを描く作法とかありそう

0239デフォルトの名無しさん2017/03/21(火) 14:18:51.18 ID:kbUhzU5T
Lispの関数 1+ とかの影響でない?

0240デフォルトの名無しさん2017/03/21(火) 14:46:18.79 ID:LpaugWCV
逆にHaskellでだけスペース挟んだりしたくないだろ

0241デフォルトの名無しさん2017/03/21(火) 19:57:22.30 ID:zopuGVTD
人間は文章を読むのに時間がかかる筈なので、質問と同時にGCを強制発動して、ユーザが質問を理解し返答を入力するまでの間にGCを終えたい

0242デフォルトの名無しさん2017/04/02(日) 18:01:47.89 ID:HoO7tpUE
「関数プログラミングの思考法」で勉強してるんですが
「たのしく学ぼう!」は楽しく理解できる内容で
こちらは余計な表現は省いている硬派な文体ですね。
そのため反ってサクサク理解していけるのですが
皆さんどうでしょうか。

0243デフォルトの名無しさん2017/04/02(日) 19:10:13.29 ID:y9d2jD+G
>>242
分かる。ノイズが多い本は理解を妨げる面があるよな。

0244デフォルトの名無しさん2017/04/02(日) 19:17:33.68 ID:W6VXUIjv
ノイズが多い本……land of lispかな?

0245デフォルトの名無しさん2017/04/03(月) 17:43:18.72 ID:n+rAkf5b
軽妙な喩えならいいんだがセンスない人がやると惨憺コース

0246デフォルトの名無しさん2017/04/03(月) 18:24:45.70 ID:Qx3jr0sY
H本に影響を受けて書かれたE本はセンスないし痛々しいしで読むのが辛かった
変な色気出して慣れないことをしないでくれ

0247デフォルトの名無しさん2017/04/03(月) 20:16:55.66 ID:uUmwarja
>>244
Land of Lisp は何故か許せる

0248デフォルトの名無しさん2017/04/03(月) 22:01:45.88 ID:cuuaF505
ノイズじゃなくて冗長性だろ。
冗長性が多いほど失った記憶を復元しやすいから覚えやすいんだぞ。
そんなことも知らないのか馬鹿だなぁ。

0249デフォルトの名無しさん2017/04/03(月) 22:37:33.25 ID:uw3ZIsiG
暗記法かな?

0250デフォルトの名無しさん2017/04/04(火) 01:02:45.85 ID:Zl9hd3NS
ラノベじゃないんだ。インクと紙の無駄遣いは止してくれ

0251デフォルトの名無しさん2017/04/07(金) 19:19:25.31 ID:sbHW0sIW
ラノベで気軽にHaskellを覚えられたらいいんだけどな

0252デフォルトの名無しさん2017/04/07(金) 20:38:50.80 ID:hQkI4asK
むしろHaskelでラノベ全文を書いたらいいんだけどな

0253デフォルトの名無しさん2017/04/07(金) 20:56:28.47 ID:lfhJbqMl
>>251
「Haskellを覚える」の意味が分からん

Haskellの何が覚えられないんだ?
文法一覧表とか入門書をいちいち見ないとコーディングできないとか?
それなら、たとえラノベに分かり易く書かれていようと、読むだけじゃ憶えられんぞ

0254デフォルトの名無しさん2017/04/07(金) 21:28:25.18 ID:TruQxjxN
英語で遠回りして結局覚えられない奴

0255デフォルトの名無しさん2017/04/07(金) 21:40:36.27 ID:aTgPduXz
Haskellをというか、ライブラリの便利な使い方を覚えるってことかな

ライブラリの型シグネチャとチョロチョロっとした英語の説明読んで、想像力働かせて『これは今までの処理がこうこう、こういう書き方でできるようになって便利ですね』と理解するのが難しい

<* や *> のパーサーでの使い方(認識だけして捨てる)を知った時はアハ体験だった

こういうのをドキュメント読んだだけで気付くということができない

0256デフォルトの名無しさん2017/04/07(金) 21:44:12.76 ID:aTgPduXz
基礎ライブラリは抽象的なので、そこから応用的具象化を想像する能力が足りない

初めてApplicativeのドキュメントを読んでその有用性に気付く奴はIQ高過ぎだろ
頭がpureだった俺は戦意喪失したものだよ

0257デフォルトの名無しさん2017/04/07(金) 21:57:17.10 ID:oAg/9XNg
誰かHaskellで萌える関数型プログラミング入門書いてくれ。

0258デフォルトの名無しさん2017/04/07(金) 22:45:53.56 ID:961Byv/H
>>257
本当に買ってくれるのか?
買ってくれるならKindleで出すかな

0259デフォルトの名無しさん2017/04/07(金) 23:09:24.70 ID:lfhJbqMl
>>255
ライブラリドキュメントを眺めていて、どんな使い方ができるんだろと想像するのは、そりゃ難しいよ。
それはドキュメントの使い方を間違っていると思う。

俺はアプリケーションを作っている時、

1. こういう引数からこういう結果になる関数が欲しい
2. 1の計算を分解すると A、B、C という計算の組み合わせになりそうだ
3. A、B、C を計算する関数をすでに誰か作っていないだろうか?

という順に考えて、A、B、C をドキュメントから探す、という使い方をしてる。


*> の例なら、誰かがパーサーで認識だけして捨てるのに使っているのを見てアハ体験をするのではない。

そうじゃなくて、初めにパーサーを作っていて認識だけして捨てたいという欲求が湧いてきて、
じゃあどうするかと考えた時に、まず「認識だけして捨てる」とはどういう計算なのかを分析する。
そうして事の本質を捉えてからドキュメントから求めるものを探す。

その時、たまたま既にパーサーの構造を Applicative で表現していれば、
ドキュメントの Control.Applicative モジュールの項を真っ先に探して *> を見つけるだろうし、
別の方法で実装していれば、実現する関数はライブラリには無さそうだなと諦めて自作するかも知れない。
何れにしてもアハ体験の出番はない。


言っておくが、アハ体験が悪いわけではないぞ。
他人の解説やソースコードを見て、そういう使い方もできるのかと学ぶ事は大事だ。
ただ、ドキュメントをそのように使うのは違うだろ、つまり(ライブラリ)ドキュメントは
解説書でも読み物でもないだろ、と言いたいんだ。

0260デフォルトの名無しさん2017/04/07(金) 23:36:42.37 ID:+bl73oc8
本来であれば入門編は有用性ではなく単相型の欠陥に気付かせるべきなんだよ
VectorInt型とかVectorChar型とか再発明を繰り返すループに気付け
その後でパラメータ多相編とアドホック多相編をやるべき

0261デフォルトの名無しさん2017/04/08(土) 01:14:10.72 ID:7QsPN9bB
>>258
買う買う。

0262デフォルトの名無しさん2017/04/08(土) 20:59:41.01 ID:gcfXcmks
>>258
かうぞー!

0263デフォルトの名無しさん2017/04/09(日) 00:41:02.14 ID:jUVd4dkj
萌は興味を引かせる手段にはなれても、理解を深める手段にはなれんよ

0264デフォルトの名無しさん2017/04/09(日) 01:31:48.04 ID:cVuKvPJL
Kindleで、標準ライブラリの一つにつき一冊かけて特集した本を電子書籍で出して

抽象的な基礎ライブラリはその応用可能性をねっとりと絡み付くまでに例示して

0265デフォルトの名無しさん2017/04/09(日) 01:36:18.18 ID:xs3hgIsU
いいっすね読んでみたい
GitBookあたりで無料で

0266デフォルトの名無しさん2017/04/09(日) 06:15:21.14 ID:bWQLB/aV
HaskellはHOW TO本が少な過ぎる
写経するだけでサクッと実用アプリを作れるような本が欲しいよね
IOが七章や八章から登場する入門書とか
Haskellを普及させる気ねぇだろw

0267デフォルトの名無しさん2017/04/09(日) 11:16:11.13 ID:6mlbYxYb
>>266
他言語でもそんな本は無いんじゃないか?
「サクッと」と「実用」がどんなレベルか知らんけど。

一応 Beginning Haskell が Web 系で実用的で、
入門者がアプリケーションを作るまでを指導してくれるが、洋書だ。

0268デフォルトの名無しさん2017/04/09(日) 13:25:40.09 ID:k7pBYoHG
Pythonなんかは
サンプルコードを書き書きしてるだけで
機械学習が出来ちゃう本なんかが出てるね

0269デフォルトの名無しさん2017/04/09(日) 14:32:15.66 ID:h7Zssp3Z
Haskellでエロイベント満載の
エロゲーを作る入門書が欲しい

0270デフォルトの名無しさん2017/04/09(日) 22:07:49.23 ID:iyanZMWu
Haskellってゲーム創るのに向いてるの?

0271デフォルトの名無しさん2017/04/10(月) 00:42:05.83 ID:6CfyD+kA
エロゲー作るのに大事なのはエロ絵だけ、プログラミング言語なんて全く関係ない

0272デフォルトの名無しさん2017/04/10(月) 01:04:16.20 ID:rMcgJXKg
圧縮した画像を取り出したりするのはC言語だと思う
他の言語を混ぜても、小規模ならC言語の占める割合が高い
だから他の言語はスケーラビリティがーと言って大規模化しようとする

0273デフォルトの名無しさん2017/04/10(月) 02:02:19.00 ID:U7/Um2af
C言語開発はストレスで禿げるから嫌だ
居玉で横歩取りするような将棋は嫌だ

0274デフォルトの名無しさん2017/04/10(月) 03:00:41.47 ID:IhGuSZfb
>>270
モナディウスあるから作れないことはないけど、C/C++のが向いてる。
Haskellに限らずJavaやC#みたいなGC使ってるのはタイミングがシビアなゲームには向かない。
(やるとしても場面切り替えのタイミングまでGC止めたりと、工夫が必要)
シビアじゃないゲームならUnityの公式言語だったり、PS VitaのSDKもC#だし、ゲームプラットフォームの選択肢多いC#じゃね?

0275デフォルトの名無しさん2017/04/10(月) 03:05:43.30 ID:Zvy/cqZx
とはいえ今時ゲームというばスマホだから
スマホ対応の難しい言語は論外だろうな

0276デフォルトの名無しさん2017/04/10(月) 03:14:10.80 ID:IhGuSZfb
ゲームとは言わんが、Haskellでスマフォアプリ作れたらなぁ。。。
Webアプリを作って、URLをスマフォの画面に置くのが関の山だろう。
Yesod本の和訳早よ。

0277デフォルトの名無しさん2017/04/10(月) 03:52:14.23 ID:mPsedSNt
同系統の言語のCleanはIDEに標準で付いてくるサンプルに
2D横スクロールアクションみたいなゲームとかTCPとかあるから
そっち使うとかは?

0278デフォルトの名無しさん2017/04/10(月) 03:58:17.94 ID:U7/Um2af
Androidで動くHaskellの話はどうなったの?

0279デフォルトの名無しさん2017/04/10(月) 05:18:31.19 ID:t1irNdwQ
どの言語でも無理矢理Androidで動かす狂人はいるけど
実用性はというと・・・お察しください

0280デフォルトの名無しさん2017/04/10(月) 08:42:46.72 ID:qzcpQwFo
>>271
声優だって大事

0281デフォルトの名無しさん2017/04/10(月) 11:21:56.58 ID:QIjIFLSF
purescriptとりあえず入れてみたけど、コンパイラしかないのな

0282デフォルトの名無しさん2017/04/10(月) 21:28:48.23 ID:490JO927
arrayの要素数を型に含めることはできないの?
それがあれば、行列の積とかで便利だと思うんだけど
オレ頭が悪いんで言っている意味が分からないかな…

0283デフォルトの名無しさん2017/04/10(月) 21:55:22.44 ID:CykROrgz
Dependent Typeで検索

0284デフォルトの名無しさん2017/04/10(月) 23:31:00.56 ID:hsDcS7Wy
JVMで動くHaskellことFregeは最近どうなっているのか

0285デフォルトの名無しさん2017/04/11(火) 00:12:08.28 ID:jIIzMyke
Haskell風AltJSのベンチマーク - Qiita
http://qiita.com/philopon/items/1451f6b8c5ccec41479d

ブラウザゲーム作るにはまだまだなのかな

0286デフォルトの名無しさん2017/04/11(火) 00:13:19.38 ID:rtc8M2j0
>>282
要素数2 Bool -> Double
要素数3 Either Bool () -> Double
要素数4 (Bool, Bool) -> Double

0287デフォルトの名無しさん2017/04/11(火) 00:40:49.07 ID:ErICxElM
仮想機械上にランタイムシステムを敷いて、さらにその上で動かすの?

……遅そう

0288デフォルトの名無しさん2017/04/12(水) 23:48:48.59 ID:BfJ17y0b
>>259
>事の本質を捉えてからドキュメントから求めるものを探す。

この能力を身につけられるHaskell本はありますか?

0289デフォルトの名無しさん2017/04/12(水) 23:59:29.26 ID:QF962/+T
>>288
それはHaskellプログラマに特有の能力じゃないし、
他言語のプログラマよりも特に優れている訳でもないから、
Haskell本に求めても無駄。
強いて挙げれば「珠玉のアルゴリズムデザイン」。

でも、もっと他の本を読んで実践した方がいい。
例えば「いかにして問題を解くか」シリーズ。

0290デフォルトの名無しさん2017/04/13(木) 00:17:54.59 ID:tWZEhHcW
Haskellは数学だから基本は数学本に丸投げだよな
しかしλとか∀とか真面目に説明した数学本は見たことがない

0291デフォルトの名無しさん2017/04/13(木) 02:17:21.29 ID:jvdUllVk
>>290
知らんだけだな

0292デフォルトの名無しさん2017/04/13(木) 02:32:00.36 ID:WRWoTzYv
数学の裏付けで支えられてる言語って安心感ある
誰しも学習に費やした時間を反故にしたくないのだ
つぶしが利く共通項目を辿って成長していきたい

0293デフォルトの名無しさん2017/04/13(木) 06:59:19.11 ID:m/ZfxtWH
>>288
むしろそれはプログラマに必須の能力。
Haskellは普通の言語でそれが見えない人にも見える様にしてくれる。
(普通の言語ではプログラマになれなかった人でもプログラマになれるかも知れない言語)

本としてはHaskell本じゃ無いが、プログラミングinOcamlが良かった。
その後にプログラミングHaskell読むと良い。
どうしてもモナド理解したかったらすごいH本も読む。

CやJavaでマージソートのコード読んでも何やってるのか分からんかったが、Haskellだと初心者向けのアルゴリズム本で、マージソートとはこう言う動きをするソートって図解を読んで、自分で書けた。

今にして思えば、他の言語のアルゴリズム本はソートがリスト前提なのに配列でいきなり作るから分かりにくいって気付いたが。
リストで作って、遅いから配列にしたい。
どう書く?みたいな書き方なら他の言語でも分かりやすいのに。

0294デフォルトの名無しさん2017/04/13(木) 11:10:39.92 ID:tWZEhHcW
>>292
残念ながら時間が無駄になる確率は0ではない
0が良いというのは数学とは関係ない人間の願望

0295デフォルトの名無しさん2017/04/15(土) 17:32:06.76 ID:JvKdzHxp
数学の分からん馬鹿の多い板だな

0296 ◆QZaw55cn4c 2017/04/15(土) 18:41:55.91 ID:4n/qWi8y
>>293
C/Java のソートはインプレイスであることが優先されるからね

0297デフォルトの名無しさん2017/04/18(火) 05:20:40.72 ID:MjkxKRKp
キャッチコピーすごいw

Haskellの美しさを
知っている人は、
人生に絶望することはない。
Haskellで世界を変えたい。
http://www.shuwasystem.co.jp/products/7980img/4806/a.jpg

0298デフォルトの名無しさん2017/04/18(火) 05:48:02.94 ID:xmEJeblZ
Haskellを学ぶことによりC++の凄さを知りました

0299デフォルトの名無しさん2017/04/18(火) 08:09:34.88 ID:aKjw+TWL
ちょっとオカルトチックにするのやめて
またHaskell馬鹿にされるじゃん

0300デフォルトの名無しさん2017/04/18(火) 09:21:24.08 ID:YlfHEX7H
その本めくってみたけど基本的な言語機能を延々噛み砕いて説明してるだけのバカが崇めるためにあるような本だった
インテリアに最適

0301デフォルトの名無しさん2017/04/18(火) 09:45:04.79 ID:zekwtXkL
プログラミング言語を国家か何かのように考えてるやつはみんなオカルト
それをやめさせることができたらノーベル平和賞を取れる

0302デフォルトの名無しさん2017/04/18(火) 10:44:46.76 ID:aKjw+TWL
Haskellは単なる科学であり魔術でも宗教でもない。余計な飾りは要らない。ただただ成果を出せばよい

というわけでHaskellの成果を挙げて

0303デフォルトの名無しさん2017/04/18(火) 18:17:01.21 ID:cdFptP3+
>>302
> Haskellは単なる科学であり魔術でも宗教でもない。余計な飾りは要らない。ただただ成果を出せばよい

正確に言えば「Haskellは単なる技術であり」だな
科学の主たる目的は真理の探究、社会に価値を生み出す(または価値を増加させたり価値の増加を容易にする)のは技術
個々のプログラミング言語、特に実用を目指している言語、は
言語に関する様々な理論(構文の理論や意味論などで、これらは自然科学ではないが数学という科学…形式哲学とでも呼ぶべきもの…の一分野の成果)の
適用としてより「容易にプログラムを書ける」とか「よりバグの発生する可能性を減らす」といった現世的な御利益つまり価値の増大や創造を求めたものだから


> というわけでHaskellの成果を挙げて

うん、技術的成果としてのプログラミング言語に対して、この要請は実に適切だね

0304デフォルトの名無しさん2017/04/18(火) 20:45:33.32 ID:+2Ki/5Wl
あのスレの次スレが立ってないからってこっちくるのはヤメレ

0305デフォルトの名無しさん2017/04/20(木) 11:33:28.13 ID:UeCe6jDz
成果出まくりのC/C++はどちらかというと嫌われ者なので
C/C++の成果をどうやって否定しようかと知恵を絞っているのが現実
成果主義は机上の空論

0306デフォルトの名無しさん2017/04/20(木) 14:02:32.75 ID:3rvpL7hF
HaskellはC++に挑む気はなさそう(代わりにRustが挑んでそう)

Haskellの相手は頑張ってJavaでしょ
Javaクラスのパフォーマンスを少ない労力でパパッと実現みたいな
一応ネイティブで動くみたいだがランタイムシステムの監督の元だし、このランタイムシステムの効率ってのが怪しい
ガベコレ技術なんかJavaのそれに何周も遅れとってそうだし

参照透明だと最適化かけ易いって? 最適化の研究進んでるの?

0307デフォルトの名無しさん2017/04/20(木) 15:34:20.89 ID:zhxiAG0o
>>306
確かにGHCはあまり性能を追求しないね。

Haskell、OCaml、RacketでGCのレイテンシを測る
http://postd.cc/measuring-gc-latencies-in-haskell-ocaml-racket/
>Haskell:ワーストケースの停止時間は51ミリ秒
>OCaml:多くの停止時間は220マイクロ秒から1ミリ秒の間で、最長は2.7ミリ秒

0308デフォルトの名無しさん2017/04/20(木) 23:42:51.61 ID:bRzOMROq
haskellをdisるスレ

0309デフォルトの名無しさん2017/04/21(金) 15:08:22.39 ID:FrhbrHvt
>>307
OCamlは性能★だけ★が売りだから速くて当然
元祖MLの醜い構文を正しモジュールに関連する諸機能を追加したのがStandard MLで
元祖MLを生み出したRobin Milner自身もStandard MLに入れ込んでいた
(Standard MLのformal semanticsの定義書とかまでMIT Pressから出版したしね)

ところがフランスINRIAの連中がMilnerやPaulsonらイギリスのStandard MLグループに対抗して
昔のMLの醜い構文のまま言語をオブジェクト指向へと拡張して作ったのがOCaml
でっ、実行性能の差で生き残ったのはOCaml
お蔭でMLはグチャグチャでグロテスクな構文のほうが生き残ってしまいましたとさ

だからOCamlは実行性能だけは良くて当然なんだよ、だってそれだけでML界の競争を生き残って来たんだから

0310デフォルトの名無しさん2017/04/26(水) 18:54:44.10 ID:tyKqE9/b
Haskellで書かれた日本人作のゲーム、Steamで販売されてる
http://store.steampowered.com/app/591640

新着レスの表示
レスを投稿する