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

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

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

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

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

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

4関連サイト2017/01/15(日) 23:47:46.51ID: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

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

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

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

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

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

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

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

10デフォルトの名無しさん2017/01/16(月) 21:52:49.11ID: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"

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

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

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

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

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

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

15デフォルトの名無しさん2017/01/17(火) 01:19:14.78ID:+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)

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

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

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

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

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

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

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

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

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

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

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

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

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

24デフォルトの名無しさん2017/01/17(火) 22:10:59.79ID:+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になると言った感じです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

show $ show "ABC"

"\"\"ABC\"\""

wwwwwwwwwww

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

print 1234
=> Say, 1234!!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

93デフォルトの名無しさん2017/01/29(日) 08:52:55.32ID: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'の型宣言を同様に修正するとエラーが出ます。
エラーが出なくするために二行目の空リスト[]を
どう修正したら良いのか分からんとです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

123デフォルトの名無しさん2017/02/11(土) 23:22:07.65ID: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 型にシリアライズすれば再コンパイルの問題は解決しますが、
今度は型の不一致や未定義メッセージなどのバグがコンパイル時に発見できなくなり、それもマズいです。

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

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

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

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

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

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

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

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

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

Haskell News
http://haskellnews.org/grouped

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

https://wiki.haskell.org/The_Fibonacci_sequence

156デフォルトの名無しさん2017/02/17(金) 13:55:10.09ID: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

157デフォルトの名無しさん2017/02/17(金) 19:08:56.34ID: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)

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

159デフォルトの名無しさん2017/02/17(金) 21:34:57.67ID: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)

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

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

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

161デフォルトの名無しさん2017/02/18(土) 01:35:58.15ID: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)
とほぼ同じ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

179デフォルトの名無しさん2017/02/22(水) 11:25:20.39ID: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

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

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

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

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

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

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

186デフォルトの名無しさん2017/02/25(土) 06:24:01.20ID: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のフィボナッチとか完全に霞んで見える。

187デフォルトの名無しさん2017/02/25(土) 11:33:38.62ID: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)だけどな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ありがと

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

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

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

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

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

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

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

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

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

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

217デフォルトの名無しさん2017/03/14(火) 22:01:52.58ID: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
もしくはそれ以外にも方法はあるのでしょうか

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Systwm.Memを調べてみます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

……遅そう

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

309デフォルトの名無しさん2017/04/21(金) 15:08:22.39ID: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界の競争を生き残って来たんだから

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

311デフォルトの名無しさん2017/04/27(木) 14:26:27.43ID:7iFRDQtz
うぉおおおおおお

312デフォルトの名無しさん2017/04/27(木) 16:50:12.06ID:YJ6E48rA
『教養としての関数型プログラミングHaskell』とかいう分厚い本どうなの

313デフォルトの名無しさん2017/04/27(木) 16:53:18.87ID:j4z9g1Hc
高価なウンコと聞いた

314デフォルトの名無しさん2017/04/27(木) 18:37:54.82ID:dGEnPbzp
読んでないが筆者の名前はhackageでよく目にする
謎のオレオレライブラリを作るのが好きな人という印象だ
https://hackage.haskell.org/user/YoshikuniJujo

315デフォルトの名無しさん2017/04/27(木) 21:51:28.67ID:fwPw5Zvz
ステマか?

316デフォルトの名無しさん2017/04/27(木) 22:06:53.42ID:YJ6E48rA
いや純粋に黒くて大きくて書店で異様な存在感を放ってたので気になったんだけどウンコだったのか

317デフォルトの名無しさん2017/04/27(木) 22:20:40.24ID:lNlBSSzH
>>313
Amazonレビューにキツめのがついてたわ

318デフォルトの名無しさん2017/04/27(木) 22:23:13.42ID:lNlBSSzH
秀○システムは毛の壁本出してしまうという暴挙以来どうもイメージが悪くてな……

319デフォルトの名無しさん2017/04/27(木) 23:09:35.55ID:Koc4MigP
タイトルからは計算論やらラムダ計算関係の知識を教えてくれそうな内容に見えるけど、
レビューや内容紹介を見ると「Haskell学習」とかなら良かったんじゃないかな?

と内容も見もせずに思いましたマル

320デフォルトの名無しさん2017/04/28(金) 00:28:50.88ID:YlIU0bJf
初心者向けにStackの使いこなし、チュートリアルとか書いた方が喜ばれたね。

321デフォルトの名無しさん2017/04/28(金) 00:38:53.42ID:vr010bnw
失望しました。代わりに Chris Okasaki 先生の純粋関数型データ構造買います

322デフォルトの名無しさん2017/04/28(金) 02:15:20.57ID:smx773DP
>>321
純粋関数型データ構造
https://www.amazon.co.jp/dp/4048930567
"Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます
http://d.hatena.ne.jp/ku-ma-me/20170316/p1
関数型言語での最適を考える:純粋関数型データ構造、Chris Okasaki
http://www.injpok.tokyo/4048930567-functional-data-structure
Edison
http://rwd.rdockins.name/edison/home/
>Edison is a library of purely function data structures
>for Haskell originally written by Chris Okasaki.

323デフォルトの名無しさん2017/04/28(金) 03:02:15.51ID:1X+/xglb
関数型言語って pure が付くととたんにマニアックになるんだよなー

324デフォルトの名無しさん2017/04/28(金) 09:01:31.72ID:tDcdNy+k
それはオブジェクト指向も同じっしょ。

325デフォルトの名無しさん2017/04/28(金) 09:57:15.79ID:1X+/xglb
あ、ホントだ

でも純粋関数型言語って 1とか2とかの数値や、
true/falseのbool値すら関数(ラムダ式)として表現するやつとかあるよね
マニアックが極まってるというか

326デフォルトの名無しさん2017/04/28(金) 10:02:36.98ID:MOddalxm
それは関数型言語なら純粋じゃ無くてもそうだが。。。

327デフォルトの名無しさん2017/04/28(金) 13:28:31.27ID:1X+/xglb
ごめん

15年以上前のうろ覚えのラムダ計算の知識しかないんだけど、
1 とかの基本型をチャーチ数のようなラムダ式で表す体系は
型なしラムダ計算でしかなりたたなくて、
型付きのラムダ計算は自然数などの基本型はラムダ式では表せないんじゃなかったっけ?

328デフォルトの名無しさん2017/04/28(金) 14:57:12.95ID:MOddalxm
うーむ。。。
まず左結合のチャーチ数をどうやって右結合のラムダ式で表現するんだろう?とか、色々イメージが掴めん。。。
確かに整数型は整数としか計算出来ないけど、型変数とかだったらズルイかもだけど行けそう。
私もそんな話は昔読んだ気がするんだが。。。
詳しい人を待ちますかね。

チャーチ数そのものは代数的型で簡単に実現出来るけど、そう言うのじゃないんだよね?

329デフォルトの名無しさん2017/04/28(金) 19:46:38.88ID:G+dyZ5vN
適切な抽象化があれば値がどうやって表されるかなんてどうでもいいよ

330デフォルトの名無しさん2017/04/28(金) 23:29:10.15ID:2Q0thsFc
関数言語得意なお前らlazy Kとかunlambdaとか得意そう

331デフォルトの名無しさん2017/04/28(金) 23:38:48.37ID:2Q0thsFc
正直言ってこういうのサッパリ分からん


ラムダ計算で代数的データ型を表現する方法 - @syamino はてなダイアリー
http://d.hatena.ne.jp/syamino/20120524/p1

332デフォルトの名無しさん2017/04/29(土) 07:20:37.24ID:dRkpt71/
もはやHaskell関係ないって言いたいところだけど
そう言えばチャーチエンコーディングってfoldr/buildそのものだな

333デフォルトの名無しさん2017/04/29(土) 09:08:18.51ID:/ij5EOcX
アプリ作る話は一切出てこない

334デフォルトの名無しさん2017/04/29(土) 10:11:28.20ID:nyANDfpK
Jpegの何バイトめから何バイトがどんな情報とかの仕様教えてくれたら頑張ってみるよ。
テキストなら割と扱えるんだけど、バイナリはデータ構造知らんと何とも。。。
こう言うところでプログラマーになれんかった。

335デフォルトの名無しさん2017/04/29(土) 10:28:52.14ID:5gNjoiIm
圧縮なんてしない方がアプリを早く作れるよ
GUIも使わない方が早く作れる
それで素早く作ったアプリは原始的なので人に見せない
科学が発達すればするほど最先端に追いつくまでの時間は長くなる

336デフォルトの名無しさん2017/04/29(土) 10:38:06.28ID:y9k82SwL
GUI使わないプログラム普段おまえら使うのか
いったい何をやっているんだ
科学計算は日常系でないからなしな

337デフォルトの名無しさん2017/04/29(土) 11:24:38.37ID:ml8UsgdM
プログラムの世界でGUI依存なんて基本的に羞恥なんだが素人かな

338デフォルトの名無しさん2017/04/29(土) 11:26:25.86ID:nyANDfpK
おいらはプログラマーの道をすっぱり諦めたから、当時一番気に入ったHaskellの残留思念だけで書きこんでる。
写真がプログラミング以上に楽しいから、Jpeg弄れるライブラリあったら触ってもいいかな。

HaskellでGUIと言えば、MSがHaskell+WXでGUIのサンプルをpdf(英語)で公開してから、海外のHaskellerは軒並みWX使ってるっぽい。
おいらの時はRWHにgtk2hsが載ってたからそれにしたけど、MSのpdf読む限りWXのがコード短い。。。
RWH恨むぞ。。。

339デフォルトの名無しさん2017/04/29(土) 11:26:31.41ID:fkqPQF0T
素人に売りつけるソフトにGUIは不可欠

340デフォルトの名無しさん2017/04/29(土) 13:06:45.39ID:dPKXkep6
アーキテクチャの話も一切出てこない

俺達は汎用プログラミング言語でいったい何をしているのか

341デフォルトの名無しさん2017/04/29(土) 15:22:04.96ID:nyANDfpK
デザパタみたいなの?
パターンって程実践で使われてないだろ。

んー。。。
使ってた感触だと、割と行き当たりばったりからの仕様変更でも何とかなるのが関数型言語の強み?と思わなくも無い。
ちょっとの変更にも関数経由するから、自然と既存の関数使い回せないか考えるし、関数型言語もそう言う風に進化して行ってるように感じる。

某スレで話題になったキャットドアクラスも、変な縛りがなければ究極的には機能の組み合わせでドアが開くかどうかの問題なのだから、タプルにBoolを並べれば良い。
ただ、同じBool値ばかりだと違う機能を付いてる(付いてない)と表現しやすいので、適当な型を作ってコンパイラが順番間違えたらエラー出すようにする。
cd = (False,型Aの値)
値が欲しかったら
getA t = snd t
または引数の時点で直接欲しい値にアクセス。
getA (_,x) = x
仕様の拡張に関してはタプルを入れ子にする事とする。
継承というよりは委譲に近い。
理屈では(以前の機能,拡張機能)の形でいくらでも入れ子に出来る。

cdEx = (cd,型Cの値,型Dの値)
cdFX = (cdEx,型Eの値)

基本機能だけなら基本のタプル取り出して使う。
getA $ fst cdEx
拡張機能だけまたは、拡張機能と基本機能の組み合わせは引数の時点で(以下略)
getC (_,x,_) = x
getAD ((_,x),_,y) = x + y

ただ、関数型言語は元々多くの状態を管理するのに向かない。
例の通り、構造が複雑になると扱い難い。
HTMLなりXMLなりXAMLなりに状態管理は任せた方がいい。
んじゃ、おいら夜勤明けなんで寝るわ。
お休みzzz...

342デフォルトの名無しさん2017/04/29(土) 15:49:01.36ID:23KWF3U2
科学計算が日常じゃないってマジ?

343デフォルトの名無しさん2017/04/29(土) 16:12:38.77ID:dPKXkep6
しかし多くの状態を楽に管理できなきゃ、
ゲームも商支援系ソフトもクリエイター系ソフトも何もまともに作れん
作れたとしても、後のメンテが辛くなるコードが出来上がる

向いているのは自身で状態を維持変化しなくてもいいような、
フィルターとしてモデリングできるものしかなくなる

たとえば linux の簡単なコマンドや web アプリ、FX自動取引システムくらいか

処理速度の問題は実用的にはほとんど気にならないレベルだと思うし、
メモリリークの問題はそれがHaskellだから諦めて、せいぜい気をつけろと言える

が、状態管理のしにくさは、これが解決すれば
爆発的にユーザーが増えそうなだけに、何か発明がほしいな

344デフォルトの名無しさん2017/04/29(土) 20:54:16.08ID:5gNjoiIm
抽象的な状態遷移はできるでしょ
ただ具体的な現実の状態を忠実に再現しろと言われるとよくわからない
忠実さを競う意味がわからない

345デフォルトの名無しさん2017/04/29(土) 22:50:14.03ID:nyANDfpK
おはー。
そこよな。
IORefとかで状態管理出来るけど、それだとデフォルト引数とかある普通の言語の方が楽。
どっちかと言えばWebプログラミングみたいにHTMLやDBに状態持ってもらって、ここの項目をこう加工したいって時だけHaskell的なのが良いと思う。
奇しくもMVCとかMVVMのモデル。

キャットドア問題みたいなのは問題自体の使いどころが判らん。
おいらは問題を解決したいのであってクラスを作りたいんじゃ無い。

オブジェクト指向でなぜ作るのかって本のジャンケンを一対一から多人数に拡張みたいなのが問題として本質を突いてると思う。
本当の仕様変更って、一旦根本から考え直さないといけない事があって、解決したいのはそこだからね。

オブジェクト指向だと、結局一旦全部壊してクラスで表現して解決。
関数型言語だと一旦バラしてリストとか加えて使い回せるのは使い回す。

346デフォルトの名無しさん2017/04/30(日) 00:00:51.50ID:qmSAdND7
関数型を選択することで、あるレベル以上の密結合を完全に禁止できる??

347デフォルトの名無しさん2017/04/30(日) 00:09:16.78ID:mJmGYhZX
>>346
禁止と言うのが、言語仕様としてコンパイラに弾かれるという意味なら、禁止にはできない。

そもそも、結合度と関数型とは何も関係ない。

348デフォルトの名無しさん2017/04/30(日) 00:24:21.53ID:SbBDypWI
そんな大規模なの作った事ないけど、少なくともクラスみたいにデータと手続きが密接に関係してるものよりは使い回しが効くよ。
ただ、それは関数型言語だからって訳じゃないと思う。
Cがグローバル変数の問題解決して、ジェネリック(テンプレート)導入すればそれで済む。
Goが一番それに近いのかな?(でもジェネリック無いんだよな。。。)
関数型言語はグローバル変数が読み込み専用で、問題になり難いから解決し易かっただけ。

私は文法の美しさでHaskellに惚れてるだけで、Haskellが絶対の解では無いと思ってる。
手続き型にはデフォルト引数とか、メッセージ引数と言う、引数の数や順番を減らしたり入れ替えても問題無い仕組みがある。
それぞれのメリット/デメリットをうまく組み合わせれば良い。

349デフォルトの名無しさん2017/05/01(月) 08:17:07.40ID:L9owkeUM
正の整数が1万個格納されたリストAの中に偶数が2個以上あるか調べたいです
手続き型だとcount=0みたいな変数を用意してループを回してcountが2になったらループを打ち切るという形になると思うのですが、
haskellだとどう書けばいいでしょうか?
filterしてから数を数えることも考えたのですがそれだと2つ見つかってからも処理が続くので少し非効率的な気がしてます
初歩的な質問で申し訳ありませんがご教授いただければ幸いです

350デフォルトの名無しさん2017/05/01(月) 09:22:52.54ID:muUl2D49
>>349
haskellは遅延評価だからtakeとfilterで無駄なループしない

length . take 2 $ filter even [1..]

351デフォルトの名無しさん2017/05/01(月) 09:38:09.96ID:TrluKRLJ
その手続き型でのカウンタ変数を蓄積引数にするだけ

solve = solve' 0
 where
  solve' 2 _ = True
  solve' _ [] = False
  solve' n (x:xs) = solve' (if even x then (n+1) else n) xs

main = print $ solve [1,3..1000001]

352デフォルトの名無しさん2017/05/01(月) 11:06:48.65ID:d2LalM1x
>>350
>>351
なるほど…ありがとうございます
どうしても手続き型の考え方に引っ張られてしまってダメですね
精進します

353デフォルトの名無しさん2017/05/01(月) 11:18:51.46ID:XSKy6kSK
遅延評価が必ずループを打ち切る保証はない
length (repeat ()) >= length [] --> ⊥
longer (repeat ()) [] --> True

longer [] _ = False
longer (_:a) (_:b) = longer a b
longer _ _ = True

354デフォルトの名無しさん2017/05/01(月) 11:46:14.32ID:y6q+iQAV
遅延評価だからtake 2で必ず評価止まるわ

355デフォルトの名無しさん2017/05/01(月) 11:52:30.52ID:IaTjJD59
入力が無限でその中にevenがなけりゃtakeでも止まんないっしょ

356デフォルトの名無しさん2017/05/01(月) 12:35:32.98ID:CeQn+bFS
さすがにその指摘は意味ないと思うけど

357デフォルトの名無しさん2017/05/01(月) 13:23:37.16ID:XSKy6kSK
でも人間にとって無意味な手をコツコツ打って勝つ戦略って最近の人工知能がやりそうだ

358デフォルトの名無しさん2017/05/01(月) 14:06:36.95ID:muUl2D49
>>355
そんな例だと遅延評価関係なく解決不可能だろう

359デフォルトの名無しさん2017/05/01(月) 15:43:00.00ID:YV6k5aHw
むしろ止まらないのが正常な振る舞いだと思うの

360デフォルトの名無しさん2017/05/01(月) 17:46:12.38ID:QnncI6PA
>>355
ちゃんと1万個って言ってるのに、どうして自分の都合の良いように前提条件変えちゃうの?
人の話聞こうよ! ゾイゾイ言ってないでさあ!

361デフォルトの名無しさん2017/05/01(月) 23:03:54.91ID:PiVFXFTP
1まんこ

362デフォルトの名無しさん2017/05/02(火) 01:06:52.67ID:98ZJhHZq
型でガッチガチに固めてコンパイルエラーで危険なコード通すの阻止してくる関数型言語の姿勢ってフールプルーフ?

363デフォルトの名無しさん2017/05/02(火) 07:41:56.01ID:kHyZ6XSn
>>360
草ァ!

364デフォルトの名無しさん2017/05/02(火) 10:12:37.54ID:HGZvLmNR
>>360
ゾイ!!!!!!!!!

365デフォルトの名無しさん2017/05/03(水) 16:56:36.78ID:8xTy/mbt
ハスケルの発音はどこにイントネーションを置けばいいですか?

366デフォルトの名無しさん2017/05/03(水) 17:08:16.15ID:j+V3ZaYg
はぁすくぅ

367デフォルトの名無しさん2017/05/03(水) 17:25:56.12ID:YQuBqP26
ハースニールと呼んであげて

368デフォルトの名無しさん2017/05/03(水) 17:34:41.80ID:3CkyOJSn
>>366
「haskell pronounce」でググれば簡単に
https://wiki.haskell.org/Pronunciation
に行き着く。

そうすれば、
https://mail.haskell.org/pipermail/haskell-cafe/2008-January/038756.html
に案内され、疑問が解消されるはずだ。

369デフォルトの名無しさん2017/05/03(水) 19:23:38.05ID:evrxvkuv
はあすこぅ

370デフォルトの名無しさん2017/05/03(水) 23:04:12.27ID:1Ttf2z2u
Cabal ケバール

371デフォルトの名無しさん2017/05/03(水) 23:21:41.48ID:mJ/QVcTI
ghcよりcabalより先にstackを入れる。

372デフォルトの名無しさん2017/05/04(木) 00:29:46.99ID:M/Hnicnq
YouTubeをhaskellで検索かけりゃいくらでも聞けるだろ

373デフォルトの名無しさん2017/05/04(木) 03:31:51.49ID:gAUNCpWB
haskellでキーボードから入力した値をそのまま出力する場合、必ず
n <- getLine
putStrLn n
のように一旦変数に束縛する必要がありますか?
一行では書けないのでしょうか

374デフォルトの名無しさん2017/05/04(木) 03:52:33.18ID:0GlJDnqX
main = getLine >>= putStrLn

375デフォルトの名無しさん2017/05/04(木) 03:55:26.58ID:gAUNCpWB
>>374
ありがとうございます

376デフォルトの名無しさん2017/05/04(木) 04:12:42.09ID:0GlJDnqX
ちなみに

main = do
____n <- getLine
____puStrLn n



main = getLine >>= \n -> putStrLn n



main = getLine >>= putStrLn

は、等価。
do形式はモナド形式を手続き型っぽく見せる糖衣構文に過ぎない。
最後のはモナド形式とカリー化を利用した部分的用で見た目の変数を無くしただけ。
モナド形式だとプログラム全体が一つの式だと言うのが良く分かる。

377デフォルトの名無しさん2017/05/04(木) 05:28:10.40ID:DGL+h71J
___n は誤解を招く

_korehaTsukaimasen

378デフォルトの名無しさん2017/05/04(木) 06:57:02.33ID:M/Hnicnq
getLine >>= putStrLn じゃなくて interact はダメなん?

379デフォルトの名無しさん2017/05/04(木) 12:19:44.49ID:xtfIuMNG
そもそも、getLineは1行しか読まないしな

380デフォルトの名無しさん2017/05/04(木) 14:29:46.30ID:gUFA1lSr
>>378
interactは変数に束縛してごにょごにょする処理を隠蔽してるだけだから
「必ず一旦変数に束縛する必要がありますか?」の答えとしては若干嘘かも

381デフォルトの名無しさん2017/05/04(木) 16:34:00.03ID:UGR/WMPx
束縛ってコード(人間の視認性)レベルの話で、コンパイラが吐くバイナリではキャンセルされてるんじゃないの?
バインドで(ポイントフリーみたいに)やったのと変わらないようになってんじゃないの

382デフォルトの名無しさん2017/05/05(金) 21:55:20.21ID:9ig94Wv/
Haskell 教養としての関数型プログラミング 単行本 ? 2017/4/15
重城良国 (著)
https://www.amazon.co.jp/dp/4798048062/

824ページって超大作だな
Haskell本の決定版か?

383デフォルトの名無しさん2017/05/05(金) 21:56:45.82ID:9ig94Wv/
Haskellによる関数プログラミングの思考法 単行本 ? 2017/2/28
Richard Bird (著), 山下伸夫 (翻訳)

https://www.amazon.co.jp/dp/4048930532/

こっちはどうなのだろう?
感想求む

384デフォルトの名無しさん2017/05/05(金) 23:25:45.93ID:e6epJNrq
>>383
>>201

数独ができるようになるけど、ワイはすごい本の方が好きや

385デフォルトの名無しさん2017/05/05(金) 23:34:27.84ID:RNJ7gaAH
すごい本やない。
すごい「H」本や。

386デフォルトの名無しさん2017/05/05(金) 23:53:12.22ID:fZIf3DTG
初めてのCっぽくて好き

387デフォルトの名無しさん2017/05/06(土) 00:17:40.31ID:gZLP5YIG
getLineでコンソールから手動入力する時、バックスペースとかで修正出来ないのってhaskeline使う以外に何か方法無いのかな?

388デフォルトの名無しさん2017/05/06(土) 00:28:11.74ID:MHgXx5Es
rlwrapとか?

389デフォルトの名無しさん2017/05/06(土) 02:13:17.67ID:gZLP5YIG
うーん、そういうのじゃないな

390デフォルトの名無しさん2017/05/06(土) 18:51:05.79ID:smzwp1ku
Comonadでオブジェクト指向を実現できるって聞いたけどほんと?

391デフォルトの名無しさん2017/05/06(土) 23:14:55.28ID:6S4yhtdG
スレ違いかもしれませんが、2つのリストに一致する項目だけ抜き出したリストを作るみたいな問題があったとき、
集合論だと集合Aと集合Bの積集合A∩Bを求めるような解き方をすると思うのですが、Haskellのようにラムダ計算が
基になっている関数型言語だとそもそもの考え方や物の見方が違ったりするのでしょうか?

Haskellを学び始めたはいいんですが、結局他言語のパラダイムを無理やりHaskellに適用させているだけのような気がして不安です

392デフォルトの名無しさん2017/05/07(日) 01:09:26.23ID:875uFfQS
>>391
質問に答えるだけの知識を持ち合わせていないので一応コードだけ

intersect :: Eq a => [a] -> [a] -> [a]
intersect xs = filter (`elem` xs)

リスト内包表現でも書けるけど関数型っぽいのはこういう書き方なのかも

393デフォルトの名無しさん2017/05/07(日) 01:46:15.37ID:s5HwRSgU
>>391
チューリング完全という意味で、他言語とHaskellは等価というのが数学的な見方だな
もし言語が複数存在する原因を知りたいなら、数学的な見方はほとんど役に立たないな

394デフォルトの名無しさん2017/05/07(日) 02:07:21.95ID:J1yK9zIW
>>392
>>393
ありがとうございます
チューリング完全でさえあればそれ以上は計算モデルより言語仕様に合わせた方が良さそうですね
いろいろ試してみて、一番スマートに書けるように精進します
今のところHaskellが一番面白いです

395デフォルトの名無しさん2017/05/07(日) 13:16:11.57ID:J1yK9zIW
>>392
ちなみに、mapやfilterとリスト内包表記は内部的にはここが違うとか、パフォーマンスが
違うとか、あるいはこういうときはこっちの方がいいとかはあるのでしょうか?

396デフォルトの名無しさん2017/05/07(日) 16:32:45.84ID:YN83nmbH
リスト内包表記はconcatMapを使うからネストできる
[f x y | x <- xs, y <- ys, p x y]
== concatMap (\x -> concatMap (\y -> if p x y then [f x y] else []) ys) xs
パフォーマンスは実際にghcがどういうコードを吐くかだけど
そのままconcatMapでもmapやfilterと同じような最適化が行われるし
必要なければリストの結合も行われない

397デフォルトの名無しさん2017/05/07(日) 16:37:16.65ID:f0nSghKy
リスト内包のほうがパフォーマンスでるらしいけどHaskellのパフォーマンスチューンングは難しいから当分気にしないほうがいい
待ってる間に線形型で楽々チューニングできるようになるかもしれないし

398デフォルトの名無しさん2017/05/07(日) 16:58:43.74ID:3IJNEy2Z
>>396
>>397
ありがとうございます
ネストの有無などで自分なりに考えながら使ってみます

399デフォルトの名無しさん2017/05/07(日) 17:18:00.54ID:m17h7+4k
内包表記と再帰を組み合わせることも可能。
夢が広がりング。

400デフォルトの名無しさん2017/05/07(日) 22:35:33.72ID:t8zqh9+K
Web系でもいいのですが、フリーウェア(できればオープンソース)のアプリケーションで、
Haskellで作られたものって何かありますか?
Haskellプログラマだけでなく、一般の人も使っているもので。

もしくは、みなさんならHaskellでどんなアプリケーションを作ってみたいですか?

401デフォルトの名無しさん2017/05/07(日) 22:48:03.22ID:ESaiO+gS
Pandocあたりは比較的広く使われている印象

402デフォルトの名無しさん2017/05/07(日) 23:26:23.39ID:xgXJ2OQ8
あとはShellCheckだな。bash初心者はとにかくこれ使えって話題のシェルスクリプト更正ツールだ。

403デフォルトの名無しさん2017/05/08(月) 00:31:05.17ID:XyXCIute
オーケーグーグル
Haskellで日本語文字列(Shift-JISやEUC-JP)のファイルを正しく処理する方法

404デフォルトの名無しさん2017/05/08(月) 17:26:21.06ID:kaDHepSW
みんな夢がないね。
ぼくなんてHaskellプログラム一つでお城のような家が建てれたよ。

405デフォルトの名無しさん2017/05/08(月) 22:42:37.72ID:0FON9WNL
>>400です。
ありがとうございます。

Haskellで作られたアプリケーションの方は2、3個紹介されるかなと思ってましたので、
まぁ予想通りです。

ですが、作りたいアプリケーションのレスが1日経っても皆無なのは驚きました。
(>>403 がいまいち分からない。これは私へのレスですか?)

私は年賀状の宛名をデザインするWebアプリを作りたいと思い、
「Beginning Haskell」を読んでWebアプリの勉強中です。

皆さん、作りたいものは何もないんですか?
ゲームとかオーサリング系とか、マストドンをhackするツール(crackではなく)とか...

406デフォルトの名無しさん2017/05/08(月) 22:56:09.94ID:9wTmIyqX
GitHubとかでHaskellで検索かけりゃ何か出てくるんじゃねーの?

407デフォルトの名無しさん2017/05/08(月) 23:03:23.31ID:a/GZsbco
論理に基づく人工知能を作るならHaskellがぴったりじゃないかと思うんだけど、プログラミングの技能も論理学の知識もないから作れない

細々と勉強はしてるけど

408デフォルトの名無しさん2017/05/08(月) 23:31:16.69ID:Vtk8jBj4
自動イタ電器とか作れや

409デフォルトの名無しさん2017/05/08(月) 23:32:41.17ID:9whwcEDU
達人プログラマーになりたい欲求はあるけど何かを作りたいっていう欲求は薄いわ

410デフォルトの名無しさん2017/05/08(月) 23:43:37.38ID:iNFmh6sq
やはりゲームだな。あとはGUIアプリ。なにかのエディタのようなものがいいな。
Haskellで複雑な状態を扱うのは困難、と言ってる人らに反論したい。
実際のところはどうなのか想像する前に、まずはそういう状況に直面する必要がある。

411デフォルトの名無しさん2017/05/08(月) 23:49:55.75ID:iNFmh6sq
EmacsのプラグインもHaskellで書きたい。正格データと遅延データを色分けして表示できたら嬉しそうだ。
GHC API を使えばできるかもしれない。

なんにしてもHaskellでやりたい。俺はもうLispは嫌だ…

412デフォルトの名無しさん2017/05/08(月) 23:59:34.03ID:0FON9WNL
>>409
どういうことですか?
私が知っている達人プログラマ、要するにハッカーですが、
彼らはみな何かを作ってました(ます)。
なので、作ることに関心が無い達人プログラマというのが想像しにくいのですが。

あ、競技プログラミングのトッププレーヤーとかですか?

413デフォルトの名無しさん2017/05/09(火) 00:07:55.03ID:CfiI0NLl
>>411
Haskellでエディタ書いてくれ
common lispで書いたエディタもあることだし

414デフォルトの名無しさん2017/05/09(火) 00:12:52.22ID:PrpfKmLN
作る以外に改造とかに気合入れる人とかもいるんじゃね?

415デフォルトの名無しさん2017/05/09(火) 00:50:22.97ID:j9MX7/aM
>>413
今は外部言語でかけるしくみがあるから、エディタそのものを置き換えなくてもいいんだ。
それが現実的だと思う。Emacsのような巨大なものは厳しい。見上げるだけで首が疲れるよ。先人は偉大だね。

416デフォルトの名無しさん2017/05/09(火) 10:12:37.98ID:jmx2rYXI
>>400
写真が趣味だから、Jpegのカラー画像をモノクロやセピアに変換するツール作りたくてHackage漁ったら使い易そうなのがCライブラリ使ってるんで、そう言うの入れやすいLinux導入。
暇があったらチマチマ作りたいけど、暇がない。。。

417デフォルトの名無しさん2017/05/09(火) 11:12:04.61ID:TCAyfaNB
itchynyタソがcamを作った時、一部の画像ファイルが(ライブラリのせいで)読めないのに腹を立てて
だったらhaskellで書いてやると一念発起したのがcamh。いまでも活躍してます。
lesspipeに組み込むとか。ちなこれはimlib2を使ってるので大抵の画像は読める。

418デフォルトの名無しさん2017/05/09(火) 22:12:03.59ID:PrpfKmLN
haskellを業務でつかうような仕事に転職すればOK

419デフォルトの名無しさん2017/05/09(火) 22:21:49.15ID:kDNeTnk7
仕事では使わんが、概念というかエッセンスはめっちゃ役に立ってるな
興味本位で触っといて良かったとマジ思う

420デフォルトの名無しさん2017/05/09(火) 22:47:25.87ID:1T1N541v
>>419
その手の話ここで時々聞くけど、Haskellの何が何にどう役だったのか、
具体的な話を聞いたことが一度もない。
$$$な状況でHaskell未経験のヤツは***だったけど、経験者の俺は###できた、とか。

そういう事を具体的に語ったブログとか無いんかな?
英語でも構わないんだけど。

421デフォルトの名無しさん2017/05/09(火) 23:13:21.51ID:0m9lmeXL
比較するなら同一のものに対して、Haskell でのアプローチと
その他のアプローチをする必要があるので、
そんな贅沢な時間の使い方するやつはユーザ数が多くないと現れないんじゃないかな?

422デフォルトの名無しさん2017/05/09(火) 23:21:27.66ID:PrpfKmLN
tanakhにhaskellやっててよかった話を要求するか

423デフォルトの名無しさん2017/05/09(火) 23:24:21.68ID:xmCSMJsq
C++やC99以降みたいな「どこでも変数宣言」を嫌うようになった
宣言した位置と使う位置が離れるのは書き方が悪いからだ、というかなんか

424デフォルトの名無しさん2017/05/10(水) 00:12:52.35ID:HNykyFkL
高階関数を多用する様になったとか、関数の純粋さを気にして関数分割する様になったとか
設計やコードが以前より分かりやすくなってテストもしやすくなったと思う
カリー化や部分適用がもっと簡単に出来たらってモヤモヤする事も多いけど

425デフォルトの名無しさん2017/05/10(水) 02:17:13.25ID:k+Fw34TB
別に関数型プログラミングって今まで出来なかったことが出来るようになる手法じゃないしな
コードを直感的に書けるようにすることでプログラムの全体的な質を高める手助けをしてくれるような感じ
メリットを語れと言われたら一晩中でも絡めちゃ語れる

426デフォルトの名無しさん2017/05/10(水) 07:52:30.59ID:JBi0Fo4L
関数型とは月極、定礎に匹敵する巨大グループだがそれが存在する証拠はない
統計学的には母集団が実在する証拠を出す義務はない

427デフォルトの名無しさん2017/05/10(水) 18:59:47.60ID:oW0tCmUv
私は、Windowsで大きなランタイムとか必要なく
実行形式のバイナリを作れるのが助かってる。
小さいバッチプログラムとか。

428デフォルトの名無しさん2017/05/11(木) 05:52:26.63ID:0s1wVfC9
ghcmod-vimってstack環境で動かないのな

429デフォルトの名無しさん2017/05/12(金) 14:16:42.66ID:jiodGJOF
haskelは使わないけど関数型の勉強はすごいためになる
ライブラリが提供する地雷メソッド見抜けるようになった

430デフォルトの名無しさん2017/05/12(金) 20:57:00.05ID:nS2W/WX/
意識的にオブジェクトをモノイドにしたりするようになった

431デフォルトの名無しさん2017/05/12(金) 21:47:41.07ID:YH3Rdz9Y
皆の言う関数型の経験が生きた事をアドバイスしてるオブジェクト指向の本が出ないのは何故か

432デフォルトの名無しさん2017/05/12(金) 22:37:15.98ID:ZlSd19FP
本を書くのが楽な作業だとでも思ってるの?

433デフォルトの名無しさん2017/05/12(金) 22:41:48.24ID:QfK6Pl49
その内容で一冊書きたいならそれをテーマにした小説にしてページを埋めないとだな
いいものはみんな本になるはずという前提がそもそも間違ってる

434デフォルトの名無しさん2017/05/12(金) 22:48:49.78ID:YH3Rdz9Y
>>432
楽かどうかの話じゃなくて、皆の言ってる事はここ数年の関数型の特長じゃないじゃん
ずいぶん昔から変わらない関数型の特長でしょ

関数型のいいところを手続き型(オブジェクト指向)にも取り入れようとし出したのもかなり昔の話だし

なのに、ここ数日このスレで挙げられた事が本になっていないのが不思議なんだよ
和書はともかく洋書でも無いじゃん

435デフォルトの名無しさん2017/05/13(土) 00:09:37.73ID:7Z9U0QOC
ハスケル環境整えやすいのって

436デフォルトの名無しさん2017/05/13(土) 00:10:00.54ID:7Z9U0QOC
Windows debian?

437デフォルトの名無しさん2017/05/13(土) 00:14:42.17ID:hYOIVOdy
>>431
うーん。。。
関数型言語じゃなくても気を付ければ出来るし、それがデザパタとかMVC/MVVMになってるからじゃないかな。
だから関数型言語はエッセンスを触接理解するのに使って、実用は普通の言語。
特にHaskellはIOと純粋関数が分かれてるからコマンドアプリでさえファイル=M、コマンドアプリ=VM、コンソール(ターミナル)や出力するGUI部品=Vって非常に明確。
使ってて、ああ、MVVMってこう言うことかって思った。
何つーか、MVCよりもMVVMはもっとCを広く解釈してるからVMなんだなぁとか。

438デフォルトの名無しさん2017/05/13(土) 00:22:55.11ID:7Z9U0QOC
C++でわからんでJAVAで半分誤解して
ruby使ったときにオブジェクト指向理解したのとよく似てるな

439デフォルトの名無しさん2017/05/13(土) 00:27:18.79ID:hYOIVOdy
経験上思ったのはオブジェクト指向は先手先手で先を読んだ設計が重要。
(だからオブジェクト指向設計とかがプログラミング以外にも必要)

関数型言語はわりと行き当たりばったりでもどうにかなるし、それはオブジェクト指向じゃない普通の言語(CとかPascal)でも活かせる。

だから、メソッドチェーン使った宣言的なオブジェクト指向よりも泥臭い手続き的なプログラミングに新たな視点(設計の幅)を与えてくれる感じ。
(要するにメソッドの中身を書くときに役立つ)

440デフォルトの名無しさん2017/05/13(土) 00:33:36.39ID:qMDptb/r
OOPはプロパティの値を書き換えてなんぼ、インスタンスの振る舞いをメソッド内で完結させて
なんぼだからまぁそりゃメソッド内くらいにしか関数型のパラダイムは取り入れられないよね

441デフォルトの名無しさん2017/05/13(土) 00:50:28.11ID:7Z9U0QOC
>>439
プログラム組む前に紙と鉛筆でじっくり図書いたことないかえ?
ライブラリ使うだけの時も恐怖でそうしてた。

442デフォルトの名無しさん2017/05/13(土) 01:35:42.34ID:tHJGZUH8
>>431
二つ以上の言語を使いこなす事をアドバイスしてる本ならあるよな
例えばシェルスクリプトとC言語の二つ
ここらへんではオブジェクト指向は必要ないし

443デフォルトの名無しさん2017/05/13(土) 11:47:21.81ID:LpfjHhl9
>>436
stack使うならどっちでも楽じゃない?

444デフォルトの名無しさん2017/05/13(土) 15:11:20.18ID:7Z9U0QOC
>>442
ほとんど知識のないまっさらの状態
ならそうだけど、
Cは覚えること山ほどあるぞ

445デフォルトの名無しさん2017/05/13(土) 17:01:20.26ID:GwlKz+MG
シェルはCのmain関数を呼び出すだけだからよかった
なぜmainではない任意の関数を呼び出す必要がないのか

なぜHaskellはCの任意の関数を呼び出すのか
答えを暗記する前によく考えてみれば、覚えることが減るんじゃないか

446デフォルトの名無しさん2017/05/13(土) 17:27:12.08ID:1EsAZpPG
Cよりjavaの方が覚えること多いよ

447デフォルトの名無しさん2017/05/13(土) 22:08:08.69ID:GC0/nJum
>>440
うーん。。。
上手く説明しきれてないな。。。
メソッドの中身書いてる時、手続き的なコード書く事多いけど、
設計変更の際に手続き的なコードだと破綻して新たにクラスを作ってオブジェクト指向的なコードに変える事があるんだけど、Haskell視点が入る事で一見破綻したコードでも、何とか破綻させずに改修できる目処が立つ事が増えた。

何つーか、手続き的なコードからオブジェクト指向的なコードへの切り替えを遅らせる。
手続き的なコードを延命する事が出来るようになったって感じかな。

448デフォルトの名無しさん2017/05/13(土) 22:42:27.32ID:Xpw0Rhcm
>>446
Cはコンパイラというかリンカのオプションが多い
JITコンパイラは覚えることが少ない

449デフォルトの名無しさん2017/05/13(土) 22:59:11.16ID:qMDptb/r
Javaはデザパタも覚えなきゃ話にならんから…

450デフォルトの名無しさん2017/05/13(土) 23:34:24.50ID:ZYwAYCy+
Haskellは初めからデザパタを、それと気づかないまま強制されているような窮屈さを感じる

451デフォルトの名無しさん2017/05/13(土) 23:36:04.40ID:GC0/nJum
それが仕事に活きるとも言える。

452デフォルトの名無しさん2017/05/14(日) 06:27:15.50ID:dFKyOZwr
代数的データは単なるVisitorパターンではなく遅延評価にも関係がある
だが同時に、型クラスで抽象化しろ、具体的な代数的データを教えるなというのがやばい

453デフォルトの名無しさん2017/05/14(日) 14:24:30.77ID:pHcsRThm
ポイントフリースタイルにこだわった方がHaskellっぽいですか?
flip関数まで使い出すと非常に混乱するのですが…

454デフォルトの名無しさん2017/05/14(日) 15:12:47.10ID:9JtdGcan
>>453
その考え方は本末転倒だと俺は思うよ。
プログラムコードで大事なのは関数型っぽいとか手続き型っぽいとかじゃなく、
プログラマ(自分)が読みやすい、意味が理解しやすいかどうかだよ。

Haskell を使うんだから関数型に合ったアルゴリズムはこだわるべきだけど、
その実装方法、つまり書き方は自分が読んで分かるように書こう。
そんな事はないだろうが、くれぐれもカッコイイとかで流されないように。

ただ、他人のコードは読めるようになった方が良いから、
そういう意味では多少トリッキーなポイントフリーにも慣れておいた方が良いかもね。

455デフォルトの名無しさん2017/05/14(日) 15:23:34.69ID:pHcsRThm
>>454
ありがとうございます
アルゴリズムを気にしながらもまずは自分と他人が読みやすいように書いていきます

456デフォルトの名無しさん2017/05/14(日) 16:43:02.99ID:uk0JawvS
プロっぽいコード書いて収入上げる

457デフォルトの名無しさん2017/05/14(日) 16:43:13.34ID:p/Ra2wac
ポイントフリーはこれが本質的な処理だ!おれは本質的なことだけ書くぜ!というカッコ良さがあるからな
珠玉のアルゴリズムとか読むと、つい憧れてしまう

しかしflipを使いまくって解読不能にするのは本末転倒

458デフォルトの名無しさん2017/05/14(日) 18:19:44.55ID:lQnp4gVk
flipの呼び出しコストって無視できるの?

459デフォルトの名無しさん2017/05/14(日) 18:24:38.81ID:I4CZOOoh
uncurryなんかもカッコいいなぁ (かなり使った
ただポイントフリーは、一度くっつけたのをまたバラす時に頭が痛くなる
一種の(視覚的な)最適化なので、頻繁に組み替えてる最中にはやりたくない

460デフォルトの名無しさん2017/05/14(日) 19:03:34.66ID:X8FkgiaC
>>458
最適化でインライン展開されるんじゃない?

461デフォルトの名無しさん2017/05/15(月) 00:57:14.99ID:ICbTDVni
ポイフリしたら型シグネチャ添えてる。本末転倒かね?

462デフォルトの名無しさん2017/05/15(月) 06:58:21.61ID:3pbiASso
>>461
それを本末転倒かもと考える事が本末転倒だよ。
大事にするところがおかしい。
コードスタイルを決めるのは何にもまして読みやすいか、考えやすいかどうかだよ。
(もちろん誰が読む、考える人かによる)

型シグネチャを添えるかどうかは本質的にはポイントフリーしたかどうかに関係ない。

・そもそも添えないと(意図したように)コンパイルできないから添える。
・添えた方がコードを読みやすい or 考えやすいから添える。
・添えない方がコードが読みやすい or 考えやすいから添えない。

これ以外の理由ってある?
(書籍に載せるのに紙面を節約するため、という理由は排除)

ちなみに俺個人は、添えた方が読みやすいし考えやすい。
どんな関数でも本体を定義する「前」に型シグネチャを書く(と言うか思い浮かべる)。
OOPにおけるインターフェース志向設計みたいなもの。

463デフォルトの名無しさん2017/05/15(月) 08:50:26.75ID:fFRu606n
いやおかしくないでしょ。
ポイントワイズなコード にするか、型シグネチャ付けるかは悩んでもいいでしょ。

コードは短い方が読みやすい。冗長でない方が読みやすい。
しかし一時変数や型注釈は別のレベルでの理解しやすさを与えてくれる。
それらを使うか、使うならどっちか、両方か、はケースバイケースだし職人芸的な深みがあると思うよ。
場合によっては関数名の類似だけで事足りることとかあるでしょう。

個人的なバランス感覚としては、なるべくポイフリするがflipは使わない、トップレベルの型シグネチャはほぼ付ける、ただし書き捨てコードは別。
(ルークよ、セクションを使え…)

464デフォルトの名無しさん2017/05/15(月) 09:43:58.61ID:WwceF0p9
使い捨てやモナドの途中でletした関数も漏れなく型シグネチャ付けるの?

465デフォルトの名無しさん2017/05/15(月) 10:00:25.10ID:3pbiASso
>>464
俺(>>462)に言ってるのかな。

俺は内部関数にはシグネチャーは基本的に書かない。
(内部関数自体、ほとんど使わないけど)
ごめん、どんな関数でもと言ったのは、トッブレベル関数のことだ。

あと、今のコーディングスタイルにしてからは、
Haskellでいわゆる使い捨てコードというものを書かないようになった。

4664632017/05/15(月) 11:04:15.21ID:fFRu606n
>>464
俺は書くときもある。でもそういう時は大抵、設計を練り直すハメになる。
なるべく上の層を充実させたいよね。

>>465
使い捨てコード書かないのは、どうなんだ。
ちょっとした実験というかお遊び的プログラミング、粘土コネコネはしないのかい。
いやでも、作っても結局設計しっかりしてないと長持ちしないなら、初めから気合い入れて製作すべきなのか。
その方がトータルのコストは節約できるということか。ううむ。

467デフォルトの名無しさん2017/05/15(月) 11:55:36.63ID:3pbiASso
>>466
実験は基本的にちょっとしたものでも捨てない。
結果的に後で捨てることになるかもしれんが、
捨てるつもりで実験はしない。
実験の目的や結果などをメモって残しておく。

実験の時も本番の時も思考の順は同じだから、まず型から考える。
だからシグネチャは書く。

お遊びは、ごめん、その状況がよく分からん。
コードを書くことを遊びにできる心は、揶揄でも何でもなく素直に感心する。
羨ましい。

粘土は要するに実験と同じだよね。
だからシグネチャは書くよ。

468デフォルトの名無しさん2017/05/15(月) 12:23:22.28ID:19VlPgPR
入門者のおれには勉強になる。
Stateとか使って型推論させると、MonadState使ったかなり複雑なシグネチャが出てくるんだけど、
あれはなるべく汎用的なシグネチャにしておくのがいいのかな?それとも具体的なシグネチャにするほうがいい?

469デフォルトの名無しさん2017/05/15(月) 12:29:59.58ID:Nyf5aX+C
>>465の言ってる「使い捨てコード」は単に無名関数くらいの意味合いじゃない?

470デフォルトの名無しさん2017/05/15(月) 13:07:35.87ID:3pbiASso
>>468
そりゃ、汎用的な関数を定義したかったら汎用的なシグネチャを書くし、
具体的な関数を定義したかったら具体的なシグネチャを書くよ。
モナドトランスのスタックがいつく積まれていようが関係ない。

あと、スタックがいくつも積まれた姿を常に目にしていると思考しにくい時もある。
そんな時は type で別名を付けて分かりやすくする。

すべては自分が考えやすく、書きやすく、読みやすくするため。

>>469
無名関数にシグネチャって
map ((\x -> if even x then 1 else (-1)) :: Integer -> Int) [1..9]
みたいにか?

それは無いでしょ。
>>464 がそんなことを聞いてるとは思えん。
まぁ、書かなきゃコンパイルできない場合もあるかもしれんが、
今のところ、そんな状況になったことは一度もない。

>>464 のレスを見て俺が想像した使い捨てコードはまさに >>466 の言うような「捨てる前提の実験コード」だよ。
それはやらなくなったから >>465 で捨てコードは書かなくなったと言ったんだ。

471デフォルトの名無しさん2017/05/16(火) 23:36:00.24ID:qM3Y9DLE
圏論を学んでみたい Haskeller、学ぼうとしたけど入門辺りで挫折してしまった Haskeller へ。

「圏論勉強会」なる一連の動画が youtube にアップされている。
(第13回まであって、それぞれ約2時間ある)
何年か前からアップされているので、知ってる人も多いと思う。

時々、Haskell で表現するとこんな感じ、といって実演して見せてくれるから面白いし、理解しやすい。

第1回はイントロダクション的な回で、圏論の雰囲気を掴むのが目的だから浅くサクサク進んでしまう。
だから難しく感じるのは当たり前なので、ここで諦めてしまわないように。
第2回からは圏論を学ぶ前の準備的な話からゆっくり丁寧に進むので安心して。

とりあえず全部一気に流して見て、2周目からじっくり学びながら見よう、
という学習スタイルはおすすめしない。
それだと1周目はテレビを何となくダラダラ見るのと同じで、何も理解できず、2周目に繋がらない。
(書籍なら自分のペースで読めるので、このスタイルでもいいと思うけどね)

それでは時間の無駄で、それなら初めから2周目のつもり挑んだ方がいい。
細かく一時停止して、今の話本当に理解できたかな、どこが理解できなかったんだろ、
といちいち理解度を確認しながら見ること。
また、動画内で例がいっぱい出てくるけど、自分でもオリジナルの例を作ってみるといい。

理解できたあかつきには、圏論はもちろん、Haskell がもっと面白くなる事を保証する。

472デフォルトの名無しさん2017/05/16(火) 23:59:22.93ID:Jwz5jkYk
圏論が分からん? 頭悪過ぎだろ。
まあコーダーなんてそんなもんかw

473デフォルトの名無しさん2017/05/17(水) 00:22:14.16ID:aIm9uZNt
圏論どうこう以前に文系出身だから数3Cすらわからんわ
すまんな

474デフォルトの名無しさん2017/05/17(水) 02:00:03.36ID:v4KZ2kPE
数学教室 πの焼き方 日常生活の数学的思考って本が圏論入門以前としては良いかも。
触り程度だけど、圏論出てる。

475デフォルトの名無しさん2017/05/17(水) 03:53:13.08ID:t193iX6C
さわりの誤用警察だ! 大人しくしろ!

476デフォルトの名無しさん2017/05/17(水) 09:13:07.50ID:DVfwNdKJ
Haskell固有のコーディングスタイルって何種類くらいあるの?それらのスタイルに名前あったりするの?

477デフォルトの名無しさん2017/05/17(水) 09:48:25.92ID:mHKUfv3k
shadowingも再代入できないから'を連打するパターン

478デフォルトの名無しさん2017/05/17(水) 09:51:42.83ID:uSaEsMW/
>>476
Haskell固有のコーディングスタイルって何?
たとえはどんなの?

479デフォルトの名無しさん2017/05/17(水) 10:55:39.88ID:knf86SYT
圏論のアイデアを盗むのは難しくない
盗用しても、そんなの圏論じゃないから盗作じゃないもんみたいな反応なので盗み放題

480デフォルトの名無しさん2017/05/17(水) 21:31:17.54ID:yFIpJ9bF
>>471
いい大人が2時間x13回なんて時間取れるかよ!ぼーっと見てるだけなんてダル過ぎ

…でもありがとう

481デフォルトの名無しさん2017/05/17(水) 22:56:48.03ID:Noyf0zx+
>>476
まだ関数脳が出来てない時は、副作用のない関数でも手続き的な書き方するけど、関数脳が出来上がったら自然と宣言的に書いていくから、コーディングスタイルと言えるようなのは段階を踏んで成長していくもの。

そう言うのじゃなくてインデント以外にも書き方あるのかと言われれば、ある。
ブレース構文と呼ばれるCっぽい書き方。

main = do { cs <- getContents;
putStr cs}

こっちはインデントに左右されない自由に書ける。

レイアウトまたはオフサイドルールと呼ばれる書き方はPythonと同じ、インデントを考慮しないとコンパイル出来ない。
こっちが主流。

ちなみに、ポイントフリースタイルはコーディングスタイルではなく、カリー化の部分適用で見た目の引数を減らす関数の書き方。

482デフォルトの名無しさん2017/05/18(木) 00:25:41.41ID:XBCR7g9y
x:xs みたいな変数名の使い方ってHaskell的だよね
関数名に意味を込めておいて変数名は短く簡潔な方がいいみたいなスタイル

483デフォルトの名無しさん2017/05/18(木) 00:27:12.80ID:xYh7ZO1T
>>476

GitHub - jaspervdj/stylish-haskell: Haskell code prettifier
https://github.com/jaspervdj/stylish-haskell

GitHub - commercialhaskell/hindent: Haskell pretty printer
https://github.com/commercialhaskell/hindent

GitHub - evolutics/haskell-formatter: Haskell source code formatter
https://github.com/evolutics/haskell-formatter

484デフォルトの名無しさん2017/05/18(木) 00:38:06.79ID:EVp+48v/
Haskellの関数のアリティは常に1なので「カリー化」も「部分適用」も存在しない

485デフォルトの名無しさん2017/05/18(木) 02:12:52.06ID:yXJEanSW
Text.Printfのprintfはスゴイことをやってることはわかる
いまだに似たようなものを書くことができない

486デフォルトの名無しさん2017/05/18(木) 03:37:21.45ID:/F28r+D1
>>482
引数の時点で使いたい構造に分けておくのは気に入ってる。
使わない部分は'_'で明示出来るし。

f xs -- リスト全体
f (x:xs) --リスト先頭と残り
f xxs@(x:xs) -- リスト全体とリスト先頭と残り同時利用
f (x:y:zs) -- リスト先頭から2個と残り

487デフォルトの名無しさん2017/05/18(木) 03:42:59.76ID:znop8OGf
遅延評価分かってるつもりだったけど分かってないな
オライリーの並列本で、次のような式があって、force使ってたら並列処理に回される前に評価されて意味無いんじゃって思ってしまった

rpar (force (map solve as))

これって、rpar引数の式が式のまま引数として渡されて、rparが並列処理内で引数を評価しようとしたタイミングでmapとforceが評価されるって理解でいいのかな?

値の遅延評価は何となく頭に入ってたけど関数の評価については意識できてなかった

488デフォルトの名無しさん2017/05/18(木) 07:48:58.07ID:u6B8rj4W
rparが来た時点で次のrpar,rseqと並列に実行し始めるという風になってるから遅延評価とは違う?ような気がする

引数を正格にするのは単に並列化済みのそれぞれの処理を速くしたいという意図では

489デフォルトの名無しさん2017/05/18(木) 07:52:51.48ID:fP2O3mzY
force自体の評価は遅延されるからね
式はまだ評価されてない値と考えればいい

490デフォルトの名無しさん2017/05/18(木) 07:58:02.16ID:ZMFFk1e9
パターンマッチの分岐を確定するのに必要な分だけ評価する
Identityモナドみたいなやつでも⊥ではないことを確定する必要があれば評価する

491デフォルトの名無しさん2017/05/18(木) 08:06:27.16ID:u6B8rj4W
ではなく、評価の深さに関係してるみたいですね。rparがWHNFまでしか評価しないので。rseqでも同じかな?

492デフォルトの名無しさん2017/05/18(木) 08:12:32.69ID:u6B8rj4W
>>491>>488に対してです。

>>489
それでは、rseqが呼ばれるまでrparの引数が評価されないように感じるんですが、いつ評価が始まるんでしょうか?

493デフォルトの名無しさん2017/05/18(木) 08:41:17.48ID:IzAvSK7+
やるなら並列にやる(いつやるとはいってない)

これが初心者キラー

494デフォルトの名無しさん2017/05/18(木) 09:02:29.66ID:fP2O3mzY
>>492
forceという関数そのものは特別扱いされないって意味
ちなみにrpar自体が引数をWHNFまで評価すると理解してるけど試せる環境がないから断言は出来ないな
forceが必要なのもWHNFの時点でrparのスパークが終わっちゃうからだと思ってるけど・・・

495デフォルトの名無しさん2017/05/18(木) 12:53:58.06ID:hXrMTvib
>>482
関数自体の汎用性とか短さも関係してると思う
変数名が具体的でなくとも何してるかパッと見てわかる関数は嬉しい

496デフォルトの名無しさん2017/05/18(木) 14:10:00.91ID:TSzqrQQ0
>>487
forceはリストの背骨までしか評価しない。
つまり

xs=[1,2,3,4,5]



xs=[_,_,_,_,_]

と評価される。

でも、そのforceもリストが評価されるまで動かない。。。
マジで並列化と遅延評価は相性悪い。

497デフォルトの名無しさん2017/05/18(木) 15:07:11.90ID:S+9vOUwt
いやControl.DeepSeqのforceは再帰的に評価する
というのもリストのNFDataインスタンスはNFData a => NFData [a]だからね
head $ head $ force [[1,undefined]] はエラー

498デフォルトの名無しさん2017/05/18(木) 17:35:00.25ID:znop8OGf
force自体は何も特別では無くて遅延評価される
但し、force関数の評価時に本来はWHNFまでしか評価しない状況でもNFまで完全評価するって感じか

499デフォルトの名無しさん2017/05/20(土) 05:58:24.02ID:7XmC+xMs
http://faithandbrave.hateblo.jp/entry/20111201/1322718742

GADTs拡張で、空でないリストを前提にコーディングできるみたいですけど、
これって、静的に空でない事が判明してないと呼び出せないんですか?
空か入ってるか判らないリストについては使えないってこと?
凄い使いにくそう

500デフォルトの名無しさん2017/05/20(土) 06:15:33.02ID:eorHP7jS
NonEmptyは何かしらのモデリングを行うときにパラメータが非空リストであるといった内部で生じる条件を明に扱えるようにするためのものかと思ってる
インポートした関数をつなぎ合わせるだけの部分で便利なものではない

501デフォルトの名無しさん2017/05/20(土) 18:25:30.00ID:SgRoQNx5
printf関数は副作用のある出力関数じゃなくて、フォーマット済みの文字列返すだけの副作用のない関数にして欲しかった。。。

502デフォルトの名無しさん2017/05/20(土) 18:29:29.96ID:1KTJ7Tkv
sprintfよろ

503デフォルトの名無しさん2017/05/20(土) 18:59:49.62ID:SgRoQNx5
本当、それ欲しい->sprintf

504デフォルトの名無しさん2017/05/20(土) 19:27:54.16ID:3Ne2dZP6
import Text.Printf

genMsg :: String -> String
genMsg name = printf "Hello, %s-san!" name

main :: IO ()
main = do
  name <- getLine
  putStrLn $ genMsg name

505デフォルトの名無しさん2017/05/20(土) 20:25:36.74ID:HYrvvmg5
ん?
もしかしてread関数みたく型指定したらいけるって事け?
テキストに行番号振るナンバリング関数で数字と文字列のタプル受け取って文字列返すラムダ式をconcat[show x,str]から書き換えたらエラー出たんだけど、型指定で行けるなら再挑戦して見るかな。。。

506デフォルトの名無しさん2017/05/20(土) 20:37:45.54ID:/vBlyS11
printfはほんと実装どうなってんのって感じ

507デフォルトの名無しさん2017/05/20(土) 20:41:46.24ID:HYrvvmg5
実装自体はHoogleで調べたら見れるけど、見ても分からんかった記憶がある。

508デフォルトの名無しさん2017/05/20(土) 21:15:44.41ID:ZfDONXvK
a=>PrintfArg、b=>PrintfTypeのとき、
String -> bはPrintfTypeである
a -> bもPrintfTypeである
StringもPrintfTypeである
IO ()もPrintfTypeである
…を繋ぐと動くんだったかな

509デフォルトの名無しさん2017/05/21(日) 06:36:57.09ID:YZtqITyu
型指定で行けたわ。
>>504thanks!!

import System.Environment
import Text.Printf

-- 数値型を文字列型に変換して文字列の頭に追加
consNum::(Int,String) -> String
consNum (x,s) = printf "%4d:%s" x s

-- 文章の行ごとに番号を振る
numbering = unlines.(map consNum).(zip [1..]).lines

-- ファイル名と内容(行番号付き)のタプルを作る
zipFile_Content f = (zip f).map numbering

-- ファイル名とファイルの内容を表示
putFile_Content (f,c) = printf "%s\n%s" f c

main = do
args <- getArgs -- コマンドから与えられたファイルのリストを受け取る
cs <- mapM readFile args -- 全てのファイルの内容を読み込む
mapM_ putFile_Content $ zipFile_Content args cs -- 全てのファイルのファイル名と内容(行番号付き)を表示

510デフォルトの名無しさん2017/05/21(日) 06:53:36.19ID:YZtqITyu
この長さならputFile_Contentをラムダ式に戻しても良いな。

511デフォルトの名無しさん2017/05/21(日) 07:21:47.89ID:NQzGLOFd
>>506
可変長引数の仕組みはこんな感じ
class Count r where count :: Int -> r
instance Count Int where count n = n
instance (Count r) => Count (a -> r) where count n = const (count (n+1))
countArgs = count 0
main = print $ (countArgs 1 True "a" :: Int)

512デフォルトの名無しさん2017/05/22(月) 19:08:38.92ID:5O5zI7xX
>>511
これcountArgは型推論で型解決されてるの?

513デフォルトの名無しさん2017/05/22(月) 22:52:47.32ID:8pBxEsLa
1 2 3みたいなコードのエラーメッセージを見るに
関数適用で引数分の関数だと推論されるんだろうね

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