2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50

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

1 :
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/
2 :
2017/01/15(日) 23:46:14.19 ID:Vh4eztBk
3 :
2017/01/15(日) 23:46:30.44 ID:Vh4eztBk
4 :
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
5 :
2017/01/16(月) 07:56:53.70 ID:fQO7vc6n
6 :
デフォルトの名無しさん
2017/01/16(月) 15:43:59.55 ID:WQ/ved8Z
Wikipediaの人工知能に適した言語のリストにHaskellがあったけど、やはり最近流行りの統計的なアプローチがされているのかな

LogicTモナドが使えるらしいけどよく分からない
7 :
デフォルトの名無しさん
2017/01/16(月) 19:31:44.98 ID:FYjqZVjV
適しているという話は聞いても
使われているという話を聞いた事はない不思議
8 :
デフォルトの名無しさん
2017/01/16(月) 19:44:49.27 ID:MHdfZn+y
>>7
村主さんが開発したFormura(Formulaではない)というプログラムを自動生成するプログラミング言語があるみたい

人工知能ではないけど似たものを感じる
9 :
2017/01/16(月) 20:10:23.15 ID:cwyxJ1cI
ディープラーニングはほぼ完全にPythonに食われちゃった
10 :
デフォルトの名無しさん
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"
11 :
デフォルトの名無しさん
2017/01/16(月) 23:17:40.44 ID:7uYw7kg2
競技プログラミングにハマるプログラマのスレ 8
http://tamae.2ch.net/test/read.cgi/prog/1483782812/l50
12 :
2017/01/16(月) 23:44:35.96 ID:YUCFPIN/
まあHaskellの質問だとHaskellスレで聞かないとスルーされるから
回答してあげるのが優しさってもんよ。
13 :
2017/01/17(火) 00:17:06.16 ID:BMtHP56w
優しい回答例
エラーの原因を探し出しその場所をピンポイントで変更してあげる

優しくない回答例
面倒だから変更できそうな場所は必要あろうがなかろうが全部変更してみろ
14 :
デフォルトの名無しさん
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人しかいないな
15 :
デフォルトの名無しさん
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)
16 :
デフォルトの名無しさん
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
17 :
デフォルトの名無しさん
2017/01/17(火) 01:35:04.21 ID:9da45IOD
>>15
勘違い。これは原因ではないので無視してください
18 :
デフォルトの名無しさん
2017/01/17(火) 01:48:42.05 ID:gNSY+qrn
皆さん
反応ありがとうございます.
Haskellは周りに聞ける人がいなかったので助かります
19 :
2017/01/17(火) 13:27:32.57 ID:KBo6p4cv
Haskellで競プロは隔靴掻痒という感想
実行制限時間がC++を前提に設定されてるから辛い
しかも Haskell 提出者が少なすぎて、AC 解答を覗いて速いコードを書く知見を獲るということができない

強い Haskeller 先輩各位は競プロサイトにアカウントを作って(競技には参戦しなくてもいいから)暇なときに過去問で誰も Haskell による AC が出てないものを適当に AC していって知見をバラまいてリードしてほしい
20 :
2017/01/17(火) 17:07:58.89 ID:upTI+ygx
>>10 の問題は実際のアプリ作りのどういうシーンに応用できるの?
21 :
2017/01/17(火) 18:24:57.23 ID:BMtHP56w
アプリの有用性ではなく難易度を研究してるんだろう

例えば人工知能が完成したらどれだけ役に立つかではなく
実際に完成する確率は何パーセントくらいかに興味がある
22 :
デフォルトの名無しさん
2017/01/17(火) 20:38:31.88 ID:+KcFvgyU
頓珍漢な質問かもしれませんが

ghciの:sprintでその時点での式の評価の深さを知ることができると思うんですが
評価の深さ自体を扱うプログラムを組むことってできるのでしょうか
23 :
2017/01/17(火) 21:11:08.46 ID:yOV+pApV
>>22
評価の深さって何?
浅い評価と深い評価の例を挙げてみてくれないか。

評価の深さ自体を扱うって、具体的には何がしたいの?
特に何かしたい訳じゃなければ、どういうプログラムを想定しているか、
に置き換えてもいいんたが、とにかく何か具体例がないと、
何を言っているのか分からん。
24 :
デフォルトの名無しさん
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になると言った感じです。

似たようなことがスマートにできる方法があれば教えて頂きたいです。
25 :
2017/01/17(火) 22:52:03.18 ID:yOV+pApV
>>24
ghc-heap-viewとかのghcハック関係のライブラリや、それらのソースをあさってみてはどうだろう。

俺も調べてみて初めて知ったが、ghc-visって面白そうだな。
26 :
デフォルトの名無しさん
2017/01/17(火) 23:13:22.52 ID:+KcFvgyU
>>25
ありがとうございます!
その辺りを勉強してみます。
27 :
2017/01/20(金) 20:35:21.61 ID:UH4PToPO
すごいとプログラミングの2冊よんだけど次どうすりゃいいの
本殆ど無いし
28 :
2017/01/20(金) 21:07:25.07 ID:NJo0QCWa
好きなもの作ればいいと思うよ
29 :
2017/01/20(金) 21:27:38.70 ID:F6U1j3oz
俺は静的型付けをゴリ押しされたのでHaskellをやってみたけど次はC++かな
静的型付けの本がないならHaskellとC++の本を読む
30 :
2017/01/20(金) 23:07:09.10 ID:Mei5GLPp
>>27
CUIの家計簿アプリを作る。
それができたら、GUIの年賀状アプリを作る。
31 :
2017/01/20(金) 23:25:09.60 ID:elfFgoly
普段から家計簿をつけないし
毎年年賀状も出さない
作るならもっと実用的なアプリはないか
32 :
2017/01/21(土) 00:19:25.12 ID:0azuxgYp
麻雀AIを作るばよい
33 :
2017/01/21(土) 01:18:36.08 ID:vr64D6+/
Real World Haskell って不人気なの?
34 :
デフォルトの名無しさん
2017/01/21(土) 06:37:05.65 ID:9Cnx0LpZ
Real World Haskell ってやつで勉強してみるは!
35 :
2017/01/21(土) 08:24:01.76 ID:bTMqa3aS
>>31
じゃあ部屋の写真や動画から、その部屋の3Dモデルを生成するアプリは?
模様替えとか、新しい友人に紹介する時とかに便利。
36 :
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/
に追加したいのだが、何か方法はないだろうか?
37 :
2017/01/21(土) 11:52:22.55 ID:Rj5My/0A
>>36
haddock-deps: true
でいけると思う
38 :
2017/01/21(土) 13:02:10.06 ID:bTMqa3aS
>>37
ありがと、できた。

少し前に stack build --help でオプション一覧を見たはずなんだが、
ボケてたのか、すっかり見逃してたみたい。
39 :
2017/01/21(土) 13:29:53.85 ID:bTMqa3aS
>>37
できたと思ったら勘違いだった。

プロジェクト内の .stack-work にはドキュメントが作られるが、
~/.stack/snaoshots 内のドキュメントには融合されない。
40 :
2017/01/21(土) 23:24:33.24 ID:pbRX6RFT
>>27
プロジェクトオイラーあたりに取り組んでみるとか
アルゴリズム系で骨のある課題がお望みなら「珠玉のアルゴリズムデザイン」をどうぞ
41 :
2017/01/21(土) 23:51:49.78 ID:Rj5My/0A
>>39
うーん、調べてみたけどわからなかった。
stack build --exec CMD でビルド後にドキュメントをコピーするか
stack build --haddock-arguments ARGS でstackからhaddockに渡るパスを上書きするとか
そういうのは思いついたけど、どっちにしても厳しいハックになると思う。
42 :
2017/01/22(日) 02:31:21.87 ID:/vT6BoNb
なんでStringってshowするときに” “ が付くの?
ダブルクォートが付かない汎用的なshowは無いの?
43 :
デフォルトの名無しさん
2017/01/22(日) 06:46:55.70 ID:0MfM9wAO
show使わなきゃいいだけじゃね
44 :
2017/01/22(日) 09:49:36.00 ID:DE1XkK5k
>>41
調べてくれて、ありがとう。
こっちでもって調べてみたけど、そもそも同じ悩みを持ってる人が見当たらない。

とりあえず今回は諦めて保留にするよ。
45 :
2017/01/22(日) 11:16:36.00 ID:8a05MHn2
実用上全く考えたこともなかったけど
show "ABC"
って
"\"ABC\""
って出力されるんだなwwwwウケる

show $ show "ABC"

"\"\"ABC\"\""

wwwwwwwwwww
46 :
2017/01/22(日) 12:04:32.12 ID:+cEF+CqT
>>42
show 2 と show "2" が区別できないと困るじゃん
47 :
2017/01/22(日) 13:42:11.92 ID:KAhPA/LR
>>42
どうしても欲しいなら作ればいい。

{-# LANGUAGE FlexibleInstances #-}
instance {-# OVERLAPPING #-} Show [Char] where show = id
48 :
デフォルトの名無しさん
2017/01/22(日) 13:55:33.85 ID:1WETee73
id = read . show にするためだゾ
49 :
デフォルトの名無しさん
2017/01/22(日) 14:50:30.18 ID:ppe8FoC9
>>19
強いHaskeller先輩「(・・・これC++で提出した方が早いな)」
50 :
2017/01/22(日) 18:20:13.46 ID:TMVq9uWR
スペースリークの問題があってまともなコードには使えないというイメージを持ってるんだが
最近はその辺どうなってるのか知ってる?
自分はホームページ出力とかのメモリリークが問題にならないコードにhaskell使ってる
でもスペースリーク解決したらもっと色んなソフト開発に使ってみたい
51 :
デフォルトの名無しさん
2017/01/22(日) 19:13:53.53 ID:0MfM9wAO
>>49
haskell-masterことtanakhさん!
52 :
2017/01/22(日) 20:48:57.10 ID:2pJ85nMW
tanakhさんは最近はHaskellどころか競プロにRustで提出しだしてるよ…
tanakhさんはHaskellを見捨てたんだ…
53 :
デフォルトの名無しさん
2017/01/22(日) 21:14:58.84 ID:0MfM9wAO
そもそもhaskell-masterと名乗って参加してたのがhaskell使えないTopCoderだったしなtanakhさん
54 :
2017/01/22(日) 21:43:58.70 ID:LUcM/+lo
>>50
他の言語なら、いらなくなった変数にnullを代入することがスペースリークの解決策

nullを代入することには問題があるというイメージだったが
むしろ解決策じゃね?というイメージに最近変わった
その変化に貢献したのがHaskellだった
55 :
2017/01/22(日) 22:35:32.21 ID:KAhPA/LR
>>50
あなたは何を以てスペースリークが解決されたと見なしてるの?
スペースリークを気にする必要がなくなった=解決なの?
もしそうなら、そんな未来は来ないと思う。

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

スペースリークなのかどうかがもっと調べやすくなる未来は来ると思うけどね。
56 :
2017/01/22(日) 23:37:17.44 ID:LUcM/+lo
これに関しては遅延評価でも並列処理でも同じこと
処理が終わったらメモリ解放されるが途中で止まったら解放されない問題
57 :
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代入しなくてよくなってるような
58 :
2017/01/23(月) 10:43:46.71 ID:txYt6xvX
>>57
project euler の何番がスペースリークのせいで解きにくかったか思い出せる?
こっちでも検証してみたい。

思い出せないのなら、1番から順にやってみるけど。
59 :
2017/01/23(月) 11:25:17.95 ID:z+XsKe69
>>58
さすがにそこまでは覚えてないけど後半はコードにスペースリークがあると
すぐセグメンテーションフォルトする
序盤の問題は時間もスペースも気にせず簡単に解ける問題が多いので
その目的なら100番ぐらいから始めた方がいいよ
1番からだとさくさく進んで楽しいけどね
60 :
2017/01/23(月) 12:27:38.51 ID:txYt6xvX
>>59
分かった。
100番以降で、かつサイズが決め打ちできないものをやってみる。
61 :
2017/01/23(月) 21:52:59.71 ID:Wt4rS9Jl
Project Eulerでの答えを求めるのには十分でも
HackerRankのProject Euler+の同じ問題でTLEしたりしたことある
62 :
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”!!

ああああああああ!!!(ブリブリブリブリュリュリュリュ!!!ブッチチブブブチチチブリリリブブブゥゥゥゥッッッ!!!)
63 :
2017/01/24(火) 00:13:24.79 ID:MMtIoejY
Showがどういう意図のものか理解してないで使ってるって話?

http://melpon.org/wandbox/permlink/qMLLG4dQGoOHcKXe
64 :
2017/01/24(火) 11:43:31.36 ID:OsDnSY6Y
showをユーザー定義する権利を与える代わりに「正しい」定義を決める義務がなくなる
というwinwinの関係
65 :
2017/01/24(火) 11:53:28.57 ID:GCEfrzc1
法則を満たしてるか静的にチェックする機構をコンパイラに実装することは理論上

@不可能
A可能(だが現実には困難)
B可能(で鋭意開発中)
C
66 :
2017/01/24(火) 12:06:44.09 ID:OsDnSY6Y
法則ではなくユーザーの自由意志です
67 :
2017/01/25(水) 07:07:08.08 ID:sKR8yojt
instance Show [Char] と書く方法の他に
instance Show Char の中で showList を定義するという方法もある
68 :
2017/01/26(木) 08:50:54.03 ID:lcTQYluv
最近Haskellの勉強を始めたのですが、
["aa", "bb", f ["cc", "dd"] ] =
["aa", "bb", "cc", "dd"]
となるような関数fはどのように書けるでしょうか
もしくはそのような既存の関数はありますか
69 :
2017/01/26(木) 11:12:47.33 ID:CzfVK0w5
>>68 型が合わないのでかけないと思う
70 :
2017/01/26(木) 13:24:39.66 ID:lcTQYluv
>>69
やはり書けませんか…
ありがとうございます
71 :
デフォルトの名無しさん
2017/01/26(木) 16:38:08.74 ID:2yUJ7U50
普通に++での結合じゃアカンのか?
72 :
2017/01/26(木) 16:46:28.90 ID:+E0dl1ly
たぶんその前の時点でアプローチがHaskellのやり方じゃないんだろう
73 :
2017/01/26(木) 17:04:34.61 ID:CzfVK0w5
スタック型言語なら直接68のやり方は可能だと思う
74 :
デフォルトの名無しさん
2017/01/26(木) 17:09:08.58 ID:gPJK2FxR
アンパックしたいのか
75 :
2017/01/26(木) 17:18:35.09 ID:MclODevV
どういう文脈でそれをしたくなったのか説明してくれれば
うまい代替案が出てくるかもよ
76 :
2017/01/26(木) 17:36:01.96 ID:9y5sHdOj
文脈は知らないが応用問題を作ればなんとなくわかる

length ["aa", "bb", f xs]
の値がコンパイル時に定数になることを証明せよ
または定数にならないような関数fを書け
77 :
2017/01/26(木) 20:00:55.44 ID:XEk5YWy9
>>76
応用つか全然違う問題じゃないか
78 :
2017/01/26(木) 21:43:31.09 ID:q6lSzUEJ
68です
単なる興味本位で出来ないものかと頭を捻らせていたもので
79 :
2017/01/27(金) 06:04:37.64 ID:gELNspyu
うーん
そもそも、それ許すとバグの温床になるからこその型だしねぇ。。。
80 :
2017/01/27(金) 07:51:28.34 ID:6/LCWfy+
Cのプリプロセッサというのを使うというのはどうだろう
81 :
2017/01/27(金) 08:14:39.10 ID:Gw4smznt
["a","b"] ++ (id ["c","d"])
あかんの?
82 :
2017/01/27(金) 08:53:18.21 ID:3bNTd4fp
それを許すと何も面白くない駄作の温床になるからね
83 :
2017/01/28(土) 01:14:43.56 ID:fSWa9KDr
Template Haskellの話題ではないのか
84 :
デフォルトの名無しさん
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 の時に
85 :
デフォルトの名無しさん
2017/01/28(土) 03:43:06.88 ID:IY+AilYG
定義されていない参照です, とエラーが出ます。
取り敢えず自分で関数書いてるので問題は無いのですが、haskellの勉強も兼ねて解消したいです。
どなたか教えて頂けないでしょうか
86 :
2017/01/28(土) 05:34:16.63 ID:vo7t9bEK
FTPだっけ。あれどうなったか知ってる人いる?
length (4,2) == 1
になっちゃうやつ。
87 :
2017/01/28(土) 09:59:41.44 ID:9bw7znio
path パッケージの Path.parseRelDir 関数で、引数に "." や "../" が指定できないのは何故?

"." や "../" って相対パスちゃうの?
88 :
2017/01/28(土) 10:15:30.83 ID:fSWa9KDr
> "." や "../" って相対パスちゃうの?

カレントディレクトリからの相対パスだが
そのpathパッケージとやらはカレントディレクトリを認識してるのか?
89 :
2017/01/28(土) 16:29:13.45 ID:1e+Xw+ps
重城良国
Haskell 教養としての関数型プログラミング


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


Haskell本が今度二冊も出るみたいですね
90 :
2017/01/28(土) 20:17:03.76 ID:9bw7znio
>>88
「カレントディレクトリを認識する」ってのがどういう意味なのか分からんのだが。

たとえば filepath パッケージに System.FilePath があるけど、
こっちのはカレントディレクトリを認識してるって言えるの?
91 :
2017/01/29(日) 00:01:01.66 ID:fPEtEvtP
>>87
なんかissueで普通ノーマライズするから不要で、そういうルールだとか言ってるが
その割に/をハードコードしてたり
言ってる意味不明だから使わない方がいいぞこれ
92 :
2017/01/29(日) 08:43:35.35 ID:INpmjvgO
>>91
path パッケージのラッパーになってる path-io パッケージは良さそうなんだが、
path の方がそんなんでは、どうもな・・・

アドバイスありがと、止めておくよ。
93 :
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'の型宣言を同様に修正するとエラーが出ます。
エラーが出なくするために二行目の空リスト[]を
どう修正したら良いのか分からんとです。
94 :
2017/01/29(日) 08:55:53.89 ID:W0xWcefq
訂正
上の myFoldr は foldr' の間違いです。
95 :
2017/01/29(日) 09:16:54.72 ID:OhLobWwB
96 :
2017/01/29(日) 13:55:23.65 ID:/KLkodo+
Foldableは単にfoldr出来ますよーってだけの型クラスだから
リストなどのインスタンスを持ってこないと具体的には定義できない
(==) :: Eq a => a -> a -> Bool
だけでは定義しようがないのと同じ
97 :
2017/01/29(日) 15:59:36.88 ID:ExFk7aPU
FTPはとっくに取り入れられてた。base 4.8.0から。気付かんかったわ
98 :
2017/02/01(水) 13:32:39.96 ID:53XrODAY
stackアップデートできねえぞ
atomでエラーでたぞ
ghciってなんでデフォルト一行なの
勉強用なの?ふつうつかわないの?
atomとそのコマンド、パッケージ選び
Gitって初心者なのに入れるの?
ないとターミナルいれられないんだが
ああめんどい
コマンドプロンプト見にくい
フォントきもい
ターミナル必要なのか
ビルゲイツしね
ターミナルってのないとエディタからコンパイルできないの?
コンパイルなし実行できないの?
ライブラリとはなにか、どこにあるのか
アトムから読めんのか
ライブラリよんで勉強するもんなのか
Windowsのディレクトリなにこれ
ユーザー名フォルダの場所とか意味不明
パスってなに、パスの通し方
こんなんググらせんなよ
よくこんなの考えやがったな

やること多すぎ 時間かかりすぎ
おぼえたくない 時間のムダ
技術じゃなくて雑学だな
自動化しとけまとめとけクソクソうんこ
それでもプログラマか
啓蒙する気ゼロだなほんと
99 :
2017/02/01(水) 13:51:05.42 ID:53XrODAY
オブジェクトファイルとインターフェースファイルのこともちゃんとまえもって教えないとダメでしょ
qiitaとか入門云々とかはてなブログとかほんと死ねばいいのよ
なんでもかんでも初心者にググらせてんじゃないよ!
100 :
2017/02/01(水) 16:06:50.00 ID:Iw+tyvVU
コンパイラは難しい
昔の古いインタプリタは簡単だった
確率は1/2じゃなくて実際は9割以上が難解な方を選ぶんだろう
101 :
2017/02/01(水) 17:56:57.37 ID:UXwydrfk
またワードサラダボットが稼働を始めたか
102 :
2017/02/01(水) 18:22:05.14 ID:C6fGSB5S
初心者じゃなくなってもなんでもかんでもググってる俺
カン拡張って何?ふむふむわからん
103 :
2017/02/01(水) 18:27:07.04 ID:v0ndbkEe
Kan拡張?
聞いた瞬間分かるわ圏論由来ってwww
圏論の本読め
104 :
2017/02/01(水) 19:57:57.60 ID:M7LFtYkC
リンシャンカイホウ?
105 :
2017/02/01(水) 20:05:04.51 ID:Iw+tyvVU
紙の本がなくなったら本を読むのもインストールで挫折する時代が来るかも
106 :
2017/02/04(土) 23:20:45.84 ID:9/lBQk1n
俺の部屋にはインストールで挫折した本が積み重なっている
107 :
2017/02/05(日) 14:17:32.23 ID:TDpThq2o
ネタバレはズルという思想があるよね
タダで教えてもらえるネタバレを全部理解してから本を買うという発想ができない
108 :
2017/02/05(日) 22:41:58.34 ID:TdsB4n5F
FIT(Framework for Integrated Test)
http://fit.c2.com/

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

試しに GitHub を探してみたけど、見当たらない感じ。
109 :
2017/02/05(日) 22:42:57.06 ID:Whb3/S6q
俺も龍を捨てて玉を詰むという勇気が出ない
110 :
2017/02/06(月) 12:52:47.67 ID:Ld2MqDtI
Haskell objectiveってどうなったの?
やっぱダメだった?
111 :
2017/02/06(月) 14:32:11.26 ID:CcXtgB5F
>>110
これか?

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

Haskell objectiveでググると最初に出てくる
112 :
2017/02/06(月) 14:44:23.19 ID:Ld2MqDtI
使いやすさ的にどうだったのかなって。
作ったの日本人っぽいけど
113 :
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
114 :
2017/02/08(水) 01:03:40.92 ID:E7OnquDd
functor分からんとHaskellは使えないの?
115 :
2017/02/08(水) 03:27:27.73 ID:lPz/aekC
凄いHを一通りやって、今はReal world haskellやってる途中
設計関連がまだよく分かってないな
モナド変換子とか非同期関連もよく分かってないや
関数型の勉強で始めたけど中々難しい
言語としては今の所簡潔で好きではある、ってか他言語の括弧がキモく見えてきた
116 :
2017/02/08(水) 09:54:44.42 ID:8j/X+nWQ
オフサイドルールには賛否両論ある
117 :
2017/02/09(木) 04:29:48.20 ID:SonJzAjc
>>114
んな事ない。
と言うか、昔はファンクタ自体無かった。
モナドあるならファンクタも入れろや的な。
モナドも、使うぶんにはいつの間にか使ってる感じ。

モナドとは何か?とか考えると難しいけど、まあモナドもファンクタも型の一種。
そう言う特性の関数や演算子を使うための。
言わば、処理の流れにも型があるとでも思ってくれ。
118 :
2017/02/09(木) 08:20:37.05 ID:CYxwUQWJ
>>114
実際的に重要なのはFunctorというよりも(そのインターフェースの)fmapの理解かな
多分よく出会うのはListのmapだけど、まずはこいつを使いこなせるようになれば
Haskellらしい、関数型らしい書き方ができるようになってくると思う
119 :
デフォルトの名無しさん
2017/02/09(木) 08:31:16.17 ID:/fB7Lbok
fmapとmapの名付けは解せない
120 :
2017/02/09(木) 08:58:32.86 ID:UTxumv29
モナド則は
型と関数と関数合成が満たすべきルール。
ただし自作モナドがモナド則を満たすことを保証する機構はない。
121 :
2017/02/10(金) 15:45:40.33 ID:5JASqTbe
fromIntegralに短縮名つけるのが癖の人っている?
fI = fromIntegral 的な
122 :
2017/02/10(金) 18:50:22.57 ID:xMx0FpSS
長くなるならletで別行で定義する
123 :
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 型にシリアライズすれば再コンパイルの問題は解決しますが、
今度は型の不一致や未定義メッセージなどのバグがコンパイル時に発見できなくなり、それもマズいです。

厳格な型システムの恩恵にあずかりながら、かつ不要な再コンパイルを抑えるようなメッセージングシステムの構築方法はないでしょうか。
124 :
2017/02/12(日) 13:50:57.94 ID:EOfitV0o
javaですら良く分からんやつに
haskellのモナドなど分かるはずも無く
125 :
2017/02/12(日) 15:45:54.11 ID:+1FsHT8L
ポインタ理解するときもモナド理解するときも小1で自転車補助輪外す時もみんな同じ感覚だった気がする
学習は滴定曲線のように、『気づいたら知って』いた
126 :
2017/02/12(日) 16:10:07.24 ID:QGOwrBDz
たいていの概念は名前も説明も勿体つけてるが実はたいしたことはない
さらに最悪なのは長々と理屈ついている割に扱いは他の概念と変わらないやつだ
そういうのを世間では屁理屈という
127 :
2017/02/12(日) 17:52:39.61 ID:C9OkM4dT
西尾維新批判はやめろ
128 :
2017/02/12(日) 21:33:24.01 ID:hoDvKKnX
アベノミクスとか新常態とかもそうだよね
129 :
2017/02/12(日) 22:25:13.91 ID:cs8Gyxec
haskellの本が出るみたいだから買ってみよう
130 :
2017/02/12(日) 23:59:55.00 ID:t7tEKqZ9
>>89の二冊か
131 :
デフォルトの名無しさん
2017/02/14(火) 00:10:05.79 ID:haBe4Sdm
お前らってこういうのチェックしてたりするの?

Haskell News
http://haskellnews.org/grouped
132 :
2017/02/14(火) 07:07:04.56 ID:0/yLOI7Z
そもそもfoldはループより速い?
133 :
2017/02/14(火) 10:36:57.61 ID:CVjuh2pk
>>132
Haskellにはループ構文はありません。
一体何と比較した話でしょうか?
134 :
2017/02/14(火) 16:50:38.39 ID:m6BuE6wx
>>133
C
135 :
2017/02/14(火) 21:33:40.60 ID:jOgsWiWm
>>134
Haskellの中で複数のアルゴリズムの比較はできますが、
C言語のforループとの速度の比較はできません。
136 :
2017/02/14(火) 23:12:33.60 ID:Bh34MboJ
バイナリを吐かせて逆汗すれば比較できるんでないの?
つっても多くの関数呼び出しはインライン展開されるんだろうが
137 :
2017/02/15(水) 05:29:57.20 ID:De10g5Ib
>>132
データ構造やコンパイラによる。
Haskellは基本リストなのでアドレスが連続してるとは限らない。
Cだと同じ処理を配列に施す様なループはSIMD命令に変換される。
Haskellはそう言う命令に変換する為のデータ構造使う。
(データの連続性を保証するためにもデータ構造が別なのだと思う)

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

入門書レベルではHaskellはCに勝てないけど、いかなる並列・並行処理も否定してない。
138 :
2017/02/15(水) 06:42:21.88 ID:+7DpWr8H
そもそもHaskellのfoldとCのforループとでは、
速度を比較するための条件をそろえる事ができません。

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

一方HaskellのfoldとCのforというレベルでは、まず計算するために入力するデータが違います。
foldの入力データ型はリスト(Foldableのインスタンス)ですが、同じものをCで再現できますか?
入力データをそろえなければ「関数程度のレベルの比較」に意味はありません。
139 :
2017/02/15(水) 07:03:08.40 ID:mu4JLPUi
扱うモナドがファンクタのとき
return . f =<< m

f <$> m
とシンプルに置き換え可能なのですね
140 :
2017/02/15(水) 10:15:38.52 ID:JnBGC/9x
何年か様子見してたけどやっぱり流行らんな
難しいから底辺には普及しないはわかるが
だったら上位の連中は食いつくかと言えばそんなことはなかった
141 :
2017/02/15(水) 11:05:35.10 ID:3lGP54OB
難いのに普及したC
142 :
2017/02/15(水) 11:41:14.45 ID:1S7+uRG8
C以前の言語がひどすぎたんだ
143 :
2017/02/15(水) 13:18:52.67 ID:jktpXUxB
えっ、Modula-2とかCより読み易くて
低レベルのシステム記述も出来たのに
全然普及せんかったでw

政治的理由と思うが突然Turbo Modula-2
の販売が中止になってTurbo-C出たけどね。
144 :
2017/02/15(水) 17:36:32.27 ID:kkhdLQ6B
出た! 陰謀論!
145 :
2017/02/16(木) 00:44:11.97 ID:PsfAYoHu
流行り廃りに合理的な理由なんてない。
146 :
2017/02/16(木) 04:02:18.89 ID:zxmzXW5F
普及言語からHaskellに乗り換えに難しく感じる部分

・do記法は関数で構成されるという関数型プログラミングの理解のための学習の邪魔をする(混乱させる)
・型を気にせず書けるスクリプト言語からだと強力すぎる型推論のおかげで型があるという感覚になじめず型に関するエラーでイラ立つ
・C言語系からだとreturnがreturn構文じゃない、if-elseが式である
・イミュータブルしかない、再代入が出来ない、(ように感じ)思うようにコード書けず辛い
・Haskellについて語る書の書き方や視点が数学寄りのものが多く理解が難しい(奴らが言うようなこまけえ数学っぽいこと気にせんでもコードは書けるっちゅうに純粋さにこだわりすぎ)
147 :
2017/02/16(木) 15:22:31.85 ID:VWTLMYuE
そもそもハスケルの強みって何?
計算時間ではビジュアルスタジオに遠く及ばないだろ?
描画とか数学的処理も他の高級言語使った方がよくね?
148 :
2017/02/16(木) 16:47:16.10 ID:fRybmYDX
仕様記述言語の強み
自分が強くなるために右往左往するよりも
強くなりたいならああしろこうしろと指図して右往左往させる側
149 :
デフォルトの名無しさん
2017/02/16(木) 18:17:34.39 ID:VWTLMYuE
右往左往の意味がよく分からんが、自分が考えて手を動かす量が減るということかな?
150 :
2017/02/16(木) 19:16:01.32 ID:9Ohg+UxU
Haskellでゲーム作りたいです!
151 :
2017/02/16(木) 20:28:16.21 ID:qwVWj3LU
言語仕様はともかく実行環境がおそ松すぎる
152 :
2017/02/16(木) 21:04:48.77 ID:lgZA8NJM
>>151
どのような意味で言っているのかよく分かりません。
もう少し詳しく説明していただけないでしょうか。
153 :
2017/02/17(金) 08:05:51.13 ID:nCBINic8
>>151
腐女子なの?
154 :
2017/02/17(金) 08:37:50.87 ID:iKIs1hpk
遅いと言われようと、フィボナッチ数列をzipWithで1行で書ける言語というところに魅力を感じている
(そんなに何度もフィボナッチ数列を書く機会があるわけではないが表現力の一例として)
155 :
2017/02/17(金) 10:28:30.13 ID:nCBINic8
1行フィボナッチって結構あるんだな全然知らなかった

https://wiki.haskell.org/The_Fibonacci_sequence
156 :
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
157 :
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)
158 :
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は動的言語なら作れるかも
159 :
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)

この関数は一方だけでも無限リストだと止まらないので注意が必要ですが、
ときどき役に立つので私は自分のツールボックスに入れています。
160 :
2017/02/17(金) 22:22:44.78 ID:nCBINic8
パスカルの三角形はロゼッタコードにあるのが限界でしょ

Pascal's triangle - Rosetta Code
https://rosettacode.org/wiki/Pascal%27s_triangle#Haskell
161 :
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)
とほぼ同じ
162 :
2017/02/18(土) 12:34:28.15 ID:OQ3VgdS2
++をネタにする作者の気持ちをスルーしてパスカルの三角形を熱く語る
理系の鑑
163 :
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
164 :
2017/02/19(日) 10:09:57.42 ID:obWbRffz
ところで・・・

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

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

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

まぁ、縛りパズルをして遊んでいるのなら分かるが。
165 :
2017/02/19(日) 11:37:29.74 ID:TYcfVj75
今ここで言う必要のないものを必要と思い込むことも縛りのパターンの一つ
166 :
2017/02/19(日) 18:51:42.32 ID:rxEXn9HF
どうしても難解になりがちはワンライナーやコードゴルフで遊ぶのは人の自由だと思うけど遊び以外で使うのはたしかにどうかと思う
167 :
2017/02/19(日) 19:20:27.12 ID:Mzz/1Hry
ポイントフリー教も1変数のパイプみたいなやつならまだ分かるのだが
(中間変数が無くなるから効率が上がるという話もある、
そのくらいGHCが最適化してくれてもよさそうなのに)
2変数以上になると完全に暗号めいてて困る
168 :
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重ループ
それと再帰のために自分自身に名前をつけた時点でポイントフリーは諦めている筈
169 :
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
170 :
2017/02/20(月) 00:18:45.73 ID:mtupkOQi
変数名かんがえたくないときポイフリできたらしちゃうことある
171 :
デフォルトの名無しさん
2017/02/20(月) 00:20:11.39 ID:bFWxmJHr
ArrowLoopの解釈はこれで合ってるの?

http://tamae.2ch.net/test/read.cgi/dame/1439747269/241-242n
172 :
2017/02/20(月) 20:56:54.49 ID:uIdMc98M
ArrowLoopがどういうインターフェイスなのかいまいちよく分からないけど
その定義でどう動くかはfによるとしか・・・
173 :
2017/02/20(月) 22:57:03.60 ID:tib6qfwe
結局ハードウェアの動きとあまりに乖離しすぎてるってのが
普及しない理由じゃないかと。
174 :
2017/02/21(火) 04:45:41.06 ID:bkUsfADx
量子コンピュータが普及する時は言語どうなるんかな
CPUに合わせた新しい言語になるのか、今の言語をベースにコンパイラに任せるのか
原理とか全く知らなくて言ってるけど
175 :
2017/02/21(火) 11:55:34.70 ID:hz5m2IGZ
メモリとCPUが分離しすぎているおかげでメモリ上のデータ構造に変化がない
OOPははそこを変えようとしたのか
分離するのやめれば破壊的イノベーションが起きるのではと
176 :
2017/02/21(火) 19:46:11.18 ID:CLRDv6M0
ほんとぉ?
177 :
2017/02/21(火) 22:11:08.30 ID:3rYbm5Zu
golangはOOPとは違うような
178 :
2017/02/22(水) 01:32:49.98 ID:doFig/5A
tanakh神って色々とやられておられるのですね

http://hackage.haskell.org/user/HideyukiTanaka
179 :
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
180 :
デフォルトの名無しさん
2017/02/23(木) 00:49:33.52 ID:9wlFqT9C
諦メロン
181 :
2017/02/23(木) 06:24:32.19 ID:1D9YdnQF
>>178
最近はRustに御執心の様子
182 :
2017/02/24(金) 02:19:21.58 ID:bZ+UJBqj
>>179
OldAとUsefulFooとNewAの設計方針が間違っていたのでは?
183 :
2017/02/24(金) 11:52:40.03 ID:e/BP7pNw
最新のGHCは簡単な余再帰が末尾再帰に変換されて最適化かかるの?
184 :
2017/02/25(土) 01:04:24.08 ID:wcM+rtIC
185 :
2017/02/25(土) 06:14:09.47 ID:rUogqkUr
これがアスペか
186 :
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のフィボナッチとか完全に霞んで見える。
187 :
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)だけどな
188 :
2017/02/25(土) 12:20:37.16 ID:5RveVCtH
こんな所で感動しちゃってどうするの
そういうのは万策尽きて神頼みするような時だけいい
数学に感情は不要
189 :
2017/02/25(土) 18:51:36.03 ID:A0aZ5Z9S
初歩的なメモ化で感動できた頃の心の輝きは大切にしていきたい
190 :
2017/02/25(土) 18:58:12.64 ID:A0aZ5Z9S
メモ化してトップダウンするより足していってボトムアップの要領の良さが勝つ回
191 :
2017/02/26(日) 22:44:13.60 ID:+sRU0DuI
stack new して作ったプロジェクトでライブラリを作りました。
(cabal ファイルに executable の代わりに library の項目を書いた)

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

この後、別の stack new したプロジェクトで、先程 stack install したライブラリを使用するには、
どうすればよいのでしょうか。
192 :
2017/02/27(月) 10:48:09.56 ID:TbO8J9W/
stack.yamlのpackagesから設定できるよ、stack installはしなくて良い https://docs.haskellstack.org/en/stable/yaml_configuration/
193 :
2017/02/27(月) 22:42:50.07 ID:6zX/SjR0
>>192
出来ました。
ありがとうございました。
194 :
2017/03/01(水) 13:33:54.14 ID:5kGyNHm4
諸君、議論したまえ
195 :
デフォルトの名無しさん
2017/03/02(木) 08:35:24.25 ID:jHvj97KG
196 :
2017/03/06(月) 19:44:44.66 ID:BYkqMHF2
新しく出たHaskell本の感想クレクレ
197 :
2017/03/06(月) 20:21:59.21 ID:j+wBUtqM
前書きだけ立ち読みしたけど
あれ関数プログラミング入門を書き直したものなんだな
198 :
2017/03/06(月) 20:28:33.59 ID:MHxEW6Wj
古い方持ってたら不要なのね
199 :
2017/03/06(月) 23:01:20.41 ID:WL27y1mu
マジかよ危うく買うところだった
200 :
2017/03/07(火) 00:14:37.81 ID:+xePePxn
かなり書き直してるよ
201 :
2017/03/07(火) 10:44:02.94 ID:mr++RUpk
Bird氏の本の第三版か。
あの人、Functional Programmingの大御所なんだね。
すごいHやGraham氏、その他日本人著者の書いたのをいろいろ読んだけど、
コアな部分を理解するならBird氏の本だと思った。
翻訳第二版のファンシーな表紙をやめて、
原著の表紙の虎を持ってきたのは何かあったのだろうか?ww
202 :
2017/03/07(火) 13:07:01.84 ID:H+HmLSCA
>>201
コアと言うのは、例えばどんな部分?
203 :
2017/03/07(火) 13:38:15.87 ID:fYd9KAIw
と思ったらそもそも関数プログラミング入門買ってなかったのでこれを機会に買おう
204 :
2017/03/07(火) 17:44:15.63 ID:rdG5C9r5
kinkyな表紙にしてくれ
205 :
2017/03/07(火) 17:49:10.46 ID:mr++RUpk
>202
最初から正格、非正格を念頭に置いた上で議論が進んでいく。その時点で既に毛色が違う。
豆知識として、リスト内包表記とdo構文の<-の関係も載ってた。
証明問題が多く、数学がわかんないときつい感じ。
206 :
2017/03/07(火) 20:23:58.44 ID:36OrCepo
>>205
あぁなるほど、そう言うのを一般に「コア」って言うのか

ありがと
207 :
2017/03/08(水) 06:06:40.10 ID:XWjfITmE
208 :
2017/03/08(水) 06:44:38.74 ID:KZ+JXzQR
今更すぎる
和訳で知ったのに原文貼って物知り顔するな
209 :
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/
210 :
デフォルトの名無しさん
2017/03/11(土) 21:23:14.84 ID:uo9d8gfu
Haskellにも依存型があと数年以内に組み込まれるらしいですが、使用目的は専ら型安全性を得るためなのでしょうか?
211 :
2017/03/11(土) 23:30:29.33 ID:UHyrmxcZ
定理証明支援系はいつですか?
212 :
resumi
2017/03/12(日) 01:08:56.73 ID:f0Kjw9v5
これ普通にショックだね。。
本当なの??
https://goo.gl/RB0asw
213 :
2017/03/12(日) 01:54:17.97 ID:kqHBJY7y
見てないけどグロ
214 :
2017/03/12(日) 22:59:29.77 ID:fpOKmvSG
最新のGHCだと余再帰が可能な限り自動で末尾再帰に変換されて最適化がかかるって聞いたんですけど本当すか?
215 :
2017/03/13(月) 08:05:36.75 ID:0mFH2buk
tanakhに訊け
216 :
2017/03/13(月) 10:55:02.44 ID:dlgNAjv1
tanakhとかうざ
217 :
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
もしくはそれ以外にも方法はあるのでしょうか
218 :
2017/03/16(木) 21:36:03.95 ID:4z74DpyU
使う型がInt32なら32を、Int64なら64をコンパイル時に決定してソースコードに埋め込むメタプログラミングな関数を書くにはどうしますか?
219 :
2017/03/16(木) 22:28:40.43 ID:4z74DpyU
Int に 対する read が遅くて困っています。
80万個のInt型をreadするのに、10^9付近の整数ばかりの場合と、1とか10とか小さな整数ばかりの場合とで 2 倍も処理時間が違ってきます。(2秒が4秒です!)
もっと速く読み込む方法はありませんか?
(但し標準入力からとします)
220 :
デフォルトの名無しさん
2017/03/16(木) 23:18:00.86 ID:xmljzEMX
readInt
221 :
デフォルトの名無しさん
2017/03/16(木) 23:20:30.52 ID:xmljzEMX
ByteStringのreadInt
222 :
デフォルトの名無しさん
2017/03/16(木) 23:21:15.32 ID:xmljzEMX
readIntegerだった
うろ覚えだったすまん
223 :
2017/03/17(金) 00:45:32.34 ID:gNJfFjGV
224 :
2017/03/17(金) 00:46:54.92 ID:gNJfFjGV
これは全然メタじゃない
225 :
2017/03/18(土) 18:18:35.73 ID:bH58Sv6/
>>221
ありがとうございます。10倍速く動くようになりました
226 :
2017/03/18(土) 19:37:41.00 ID:bH58Sv6/
ひょっとして、foldl か foldl' かよりも、そこに渡す二項関数の方を正格にするか遅延のまま
かが速度に関わっているのでしょうか?

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

サンクが要らないからその部分(サンクの作成と破棄)のオーバーヘッドがなくなってちょっとだけ速くなるのか。でもあくまで foldl' の利点は省メモリの方か
228 :
2017/03/19(日) 10:06:06.54 ID:awlj00/Y
https://github.com/google/codeworld
http://code.world/

これに関する質問ってこのスレでいいの?
229 :
2017/03/19(日) 10:30:10.95 ID:fNC16+Hl
速度の比較をしたいならまずプロファイルを取りなさい
230 :
2017/03/19(日) 14:43:43.30 ID:qjqnp6Y8
V8エンジンで無茶苦茶速くなったことだし、もうTypeScriptでいいやと思うようになった。
231 :
デフォルトの名無しさん
2017/03/20(月) 20:37:53.08 ID:H6ds3WUf
教えてください

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

そもそもそういう発想が間違いかも?
232 :
2017/03/20(月) 22:25:28.88 ID:THpWaU1J
mark&sweepいらないなと思った時に参照カウントに変更する方法
言語を変えなくてもコンパイラを変えるだけでできそう(できたとは言ってない)
233 :
2017/03/20(月) 22:42:41.03 ID:tOiVLltG
>>231
用済みになった時に手動で解放というのが、

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

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

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

後者なら、base パッケージの Systwm.Mem モジュールを調べてみて。
これなら分かる。
例えばゲームで、できるだけステージ途中で時間かかかるGCが起動しないように、
ステージ開始直前に強制的にGCさせたい、とか。
234 :
デフォルトの名無しさん
2017/03/20(月) 22:58:59.79 ID:H6ds3WUf
>>233
ありがとう。質問してよかった。

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

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

Systwm.Memを調べてみます。
235 :
デフォルトの名無しさん
2017/03/21(火) 07:16:46.72 ID:RPjo5BAn
演算子の部分適用の書き方で
演算子との間にスペースを書かないのはHaskellの作法?
(+ 3) (3 +) じゃなく (+3) (3+) って書くじゃんみんな
236 :
2017/03/21(火) 09:36:45.55 ID:bH1u/9cj
みんなそうしてるから真似してそうしてるだけだろ。
わからないことは調べるのはめんどくさいから真似しておこうとか思ってそう。
237 :
2017/03/21(火) 13:49:23.04 ID:L0SduR/f
>>235
普通に2項演算子として用いている場合は項と演算子とが独立してる感があるが、
部分適用した場合は「3を加える関数」という一塊の概念というイメージが強い
なんとなくだけどそんな使い分けではないかと思ってる
238 :
2017/03/21(火) 13:55:43.06 ID:TPAad80u
GUIには等幅ではないフォントがあるから
1ピクセル単位でスペースを描く作法とかありそう
239 :
2017/03/21(火) 14:18:51.18 ID:kbUhzU5T
Lispの関数 1+ とかの影響でない?
240 :
2017/03/21(火) 14:46:18.79 ID:LpaugWCV
逆にHaskellでだけスペース挟んだりしたくないだろ
241 :
2017/03/21(火) 19:57:22.30 ID:zopuGVTD
人間は文章を読むのに時間がかかる筈なので、質問と同時にGCを強制発動して、ユーザが質問を理解し返答を入力するまでの間にGCを終えたい
84KB

新着レスの表示

★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: