関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/
関数型プログラミング言語Haskell Part31©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
2017/09/27(水) 02:33:08.70ID:2XAqPuH2
813デフォルトの名無しさん
2018/10/17(水) 14:46:13.41ID:97sxRiiz >>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。
それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、
・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
分けていないコード大っ嫌い。
・高凝集度で低結合度なコードは好き。
逆は嫌い。
・1つの小さな仕事をさせている関数は好き。
いくつもの仕事をさせて肥えている関数は大嫌い。
・1つの役割だけをしっかり果たしているモジュールは好き。
ごった煮モジュールは大嫌い。
この基準でいくと、あなたのコードはまったくイケてない。
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。
それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、
・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
分けていないコード大っ嫌い。
・高凝集度で低結合度なコードは好き。
逆は嫌い。
・1つの小さな仕事をさせている関数は好き。
いくつもの仕事をさせて肥えている関数は大嫌い。
・1つの役割だけをしっかり果たしているモジュールは好き。
ごった煮モジュールは大嫌い。
この基準でいくと、あなたのコードはまったくイケてない。
814デフォルトの名無しさん
2018/10/18(木) 00:55:40.72ID:EL1XNa21 >>813
あざっす!勉強になりやした!精進しやす!
あざっす!勉強になりやした!精進しやす!
815デフォルトの名無しさん
2018/10/19(金) 20:20:03.11ID:XWoSmko3 >>813
そういうコードの設計センスはどうやって学んだのですか?
そういうコードの設計センスはどうやって学んだのですか?
816デフォルトの名無しさん
2018/10/19(金) 21:59:48.14ID:Jw4VQ9Ey >>815
大半はHaskell関係なくて、設計論の話
大半はHaskell関係なくて、設計論の話
817デフォルトの名無しさん
2018/10/19(金) 22:13:22.28ID:8Ox5P+xa テストどうすんべとか、保守どうしようとか、合成できるようにしたいとか
考えるとええんやで(こなみ)
考えるとええんやで(こなみ)
818デフォルトの名無しさん
2018/10/20(土) 12:25:50.44ID:u8BRF3D8819デフォルトの名無しさん
2018/10/24(水) 13:56:56.60ID:eHXbzfVY +が正格で:が正格じゃないということの意味を教えてください。
820デフォルトの名無しさん
2018/10/24(水) 15:31:36.63ID:eHXbzfVY じこかいけつしますたw
821デフォルトの名無しさん
2018/10/30(火) 14:24:11.19ID:pQwXzgRa stack の lts-12.x にはなぜ Yampa パッケージがないんだろ?
11.x の頃はあったのに。
11.x の頃はあったのに。
822デフォルトの名無しさん
2018/11/02(金) 08:09:05.71ID:QsNsn2yU stackでhp2prettyってどうやってインストールするの?
823デフォルトの名無しさん
2018/11/02(金) 15:49:58.24ID:98olsR6p824デフォルトの名無しさん
2018/11/03(土) 07:37:57.15ID:KyIBYeD2 >>823
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
825デフォルトの名無しさん
2018/11/07(水) 13:48:52.85ID:VCaKs67w 以前の GHC.Stats モジュールには GCStats 型がありましたが、
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。
そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。
そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
826デフォルトの名無しさん
2018/11/09(金) 08:25:29.12ID:rrSKeTdW f :: a -> b -> c
このコロン以降の部分って、英語圏の人は何て発音してるの?
"a to b to c" で良いの? 不自然かな?
このコロン以降の部分って、英語圏の人は何て発音してるの?
"a to b to c" で良いの? 不自然かな?
827デフォルトの名無しさん
2018/11/09(金) 11:20:46.63ID:DHGOZxva 英語圏のコミュニティで日本人なんだけど。。。って質問した方が早いのでは。。。
828デフォルトの名無しさん
2018/11/09(金) 11:46:57.84ID:z1XmYBYX そもそも日本人はどう読むんだよ
829デフォルトの名無しさん
2018/11/09(金) 11:47:53.76ID:p9aTnaT/ a arrow b arrow c
call a, b, and c
call a, b, and c
830デフォルトの名無しさん
2018/11/09(金) 12:13:53.97ID:vhYIIJha 漫画と同じだろ
台詞は発音するが絵は発音しない
a b c以外は発音しない
台詞は発音するが絵は発音しない
a b c以外は発音しない
831デフォルトの名無しさん
2018/11/09(金) 15:06:42.54ID:gCUmlTjd エフはエーからビーからシー
って読んでるわ
って読んでるわ
832デフォルトの名無しさん
2018/11/09(金) 19:57:17.40ID:Rc4d95qg >>828
ほんそれ
ほんそれ
833デフォルトの名無しさん
2018/11/09(金) 20:22:07.58ID:rrSKeTdW834デフォルトの名無しさん
2018/11/09(金) 20:43:11.08ID:Rc4d95qg それって、そもそも発音する場面なんてあるか?
って意味じゃ・・・
つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
って意味じゃ・・・
つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
835デフォルトの名無しさん
2018/11/09(金) 21:02:46.92ID:XtklT8Hz 身近にハスケルの話しできる人なんかいないから発音したこと無いぜ
836デフォルトの名無しさん
2018/11/09(金) 23:03:09.33ID:TUe4RwSk Haskell使って仕事してる人に聞いてみるしかないな
837デフォルトの名無しさん
2018/11/09(金) 23:07:51.58ID:9yt5Xmdj >>834
えっと、びーと、えっと、しー
えっと、びーと、えっと、しー
838デフォルトの名無しさん
2018/11/09(金) 23:19:25.21ID:ThtHVzoQ いや〜ん エッチィ
839デフォルトの名無しさん
2018/11/10(土) 02:48:27.14ID:A3qdJv3l c9のhuttonとmeijerのlectureでは、huttonが a to b、meijerが
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい
(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい
(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間
840デフォルトの名無しさん
2018/11/15(木) 22:01:12.82ID:ExoyI5Rr 2つの型クラスの間に包含関係を付けるのに
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
841デフォルトの名無しさん
2018/11/15(木) 22:08:48.54ID:349+82Of 変数に再代入できる言語に
慣れきっている者の質問なのですが
[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。
ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]
fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)
-- reverse $ fn 0 ints1 []
慣れきっている者の質問なのですが
[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。
ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]
fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)
-- reverse $ fn 0 ints1 []
842デフォルトの名無しさん
2018/11/15(木) 22:24:44.73ID:jJzADtia scanl (+) 0 [1..8] では?
素人なのでわからないけど
素人なのでわからないけど
843デフォルトの名無しさん
2018/11/15(木) 23:19:14.92ID:5uoUpH2U 842です
foldで書いてみました
fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]
-- fn [1..8]
foldで書いてみました
fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]
-- fn [1..8]
844デフォルトの名無しさん
2018/11/15(木) 23:51:13.43ID:349+82Of845デフォルトの名無しさん
2018/11/15(木) 23:58:57.35ID:349+82Of846デフォルトの名無しさん
2018/11/16(金) 00:12:59.47ID:mACu1uNV 842です
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと
先輩諸兄のレスを待ってください
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと
先輩諸兄のレスを待ってください
847デフォルトの名無しさん
2018/11/16(金) 01:31:49.81ID:1zT7OHrw 何使ってもいいならData.Listのinitsを使って
map sum $ inits [1..8]
が楽チン。
map sum $ inits [1..8]
が楽チン。
848デフォルトの名無しさん
2018/11/16(金) 18:07:13.25ID:0oMzWKAu >>840
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ
>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ
>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs
849デフォルトの名無しさん
2018/11/16(金) 18:12:37.84ID:3YKNNj99 正直全然読みやすくないのだが、本当に読みやすくないのか俺が手続き脳なだけなのか判断がつかない
850デフォルトの名無しさん
2018/11/16(金) 18:56:19.39ID:0oMzWKAu >>849
qのところが(f q x)に替わって再帰してるだけだよ
scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10]
qのところが(f q x)に替わって再帰してるだけだよ
scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10]
851デフォルトの名無しさん
2018/11/18(日) 07:38:58.15ID:2lh9j78G if then elseを最近知った位の超初心者です。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。
kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても
kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld2 [1/2,1/2] [1/4,3/4]
<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?
モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。
kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても
kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld2 [1/2,1/2] [1/4,3/4]
<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?
モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
852デフォルトの名無しさん
2018/11/18(日) 08:49:53.03ID:FSPPo7pC if-then-else
で返り値の型が違う
で返り値の型が違う
853デフォルトの名無しさん
2018/11/18(日) 09:57:38.99ID:XromDw/4 >>852
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。
kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3]
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。
kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3]
854デフォルトの名無しさん
2018/11/19(月) 18:56:00.44ID:NOUcIUOi855デフォルトの名無しさん
2018/11/20(火) 08:29:50.51ID:kos1zZ3I 関数型プログラミングでログ出力ってどうやってるんですか?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
856デフォルトの名無しさん
2018/11/20(火) 10:01:49.03ID:jmuJusIM flush
857デフォルトの名無しさん
2018/11/20(火) 10:53:51.88ID:QMY+cuul Writerでは例外のようなものを投げることができないからもっと万能なモナドを使う
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
858デフォルトの名無しさん
2018/11/20(火) 15:05:53.63ID:Bz9DRyU5 エラーが起きないように組めばいい
859デフォルトの名無しさん
2018/11/20(火) 16:37:16.27ID:kos1zZ3I 素直に副作用のある言語で組めってことですね
了解です
了解です
860デフォルトの名無しさん
2018/11/20(火) 18:07:48.61ID:QMY+cuul Haskellにも副作用はある
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ
861デフォルトの名無しさん
2018/11/20(火) 18:35:37.40ID:kZ/DcFbd >>855
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。
862デフォルトの名無しさん
2018/11/20(火) 21:54:07.61ID:tqW5qw7T RWHの例外周りは古いからPCPH勧めないと
863デフォルトの名無しさん
2018/11/24(土) 12:20:05.11ID:dO0ZWwxC haslell2010.pdfによくでてくる記号なんだけど”⊥”ってどう意味ですか?
値とか型ぽいんだけど、すごいH本とかの索引にはそんなん無いし。
https://www.haskell.org/definition/haskell2010.pdf
値とか型ぽいんだけど、すごいH本とかの索引にはそんなん無いし。
https://www.haskell.org/definition/haskell2010.pdf
864デフォルトの名無しさん
2018/11/24(土) 13:06:50.85ID:4kdGLnPd 直交
865863
2018/11/24(土) 13:10:25.20ID:dO0ZWwxC 例えば、こんな書き勝たされてるんだけど
P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.
”⊥ otherwise”って何だろう?
P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.
”⊥ otherwise”って何だろう?
866デフォルトの名無しさん
2018/11/24(土) 13:16:55.35ID:A/C05uoV 数学やれようざい
867デフォルトの名無しさん
2018/11/24(土) 13:24:01.18ID:dO0ZWwxC ええええ 本当に直交って意味なの?
数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
868デフォルトの名無しさん
2018/11/24(土) 13:28:15.64ID:4kdGLnPd 独立
869デフォルトの名無しさん
2018/11/24(土) 13:38:59.48ID:tsQBCVAv870デフォルトの名無しさん
2018/11/24(土) 13:43:43.78ID:dO0ZWwxC871デフォルトの名無しさん
2018/11/24(土) 13:59:53.00ID:1C+vWWG1872デフォルトの名無しさん
2018/11/24(土) 14:01:51.50ID:1C+vWWG1873デフォルトの名無しさん
2018/11/24(土) 14:15:54.52ID:1C+vWWG1 take undefined [] = undefined ― 入力待ち(Carl + Cで強制終了必須)
take 0 undefined = []
⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。
take 0 undefined = []
⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。
874デフォルトの名無しさん
2018/11/25(日) 11:21:25.73ID:gET8Juo7 undef :: b -> a
undef ined = undef ined
これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる
undef ined = undef ined
これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる
875デフォルトの名無しさん
2018/12/03(月) 16:13:07.05 Haskell では明示的に instance 宣言しなければ、ある class の要件を充たしていることをコンパイラが認識してくれません
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳)
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳)
876デフォルトの名無しさん
2018/12/05(水) 06:15:37.43 GitLab へ引っ越すんですって?
877デフォルトの名無しさん
2018/12/11(火) 10:40:31.76ID:w4wbcBCq bsort [] = []
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)
バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)
バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。
878デフォルトの名無しさん
2018/12/11(火) 10:48:30.82ID:w4wbcBCq 動作はこんな感じ。
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]
最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?)
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]
最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?)
879デフォルトの名無しさん
2018/12/11(火) 12:12:51.51ID:b3hhTnN8 スタックがヤバそう
880デフォルトの名無しさん
2018/12/11(火) 13:48:28.37ID:w4wbcBCq [a] -> [b]な再帰関数はスタック消費しないよ。
881デフォルトの名無しさん
2018/12/16(日) 14:26:10.12ID:d+Ts3kFC よりスマートに
https://gist.github.com/WhiteCat6142/a3270468cbf829200b7f66acd048b1a2
bsort=foldr bs []
where bs x []=[x]
bs x (y:ys)|x<=y =(x:y:ys)
|otherwise =(y:bs x ys)
https://gist.github.com/WhiteCat6142/a3270468cbf829200b7f66acd048b1a2
bsort=foldr bs []
where bs x []=[x]
bs x (y:ys)|x<=y =(x:y:ys)
|otherwise =(y:bs x ys)
882デフォルトの名無しさん
2018/12/18(火) 11:44:17.44ID:/M0/bFGF 歯透ける
883デフォルトの名無しさん
2018/12/18(火) 12:01:03.47ID:NUNmy+BV パンツ透ける
884デフォルトの名無しさん
2018/12/18(火) 14:51:09.99ID:LIt8HoLP885デフォルトの名無しさん
2018/12/18(火) 17:19:38.38ID:D1bDvywT 余再帰でも最適化かかる場合があるとかないとか
886デフォルトの名無しさん
2018/12/19(水) 09:01:32.80ID:xYxnZ8u2 最適化って言うけど最適化無しのddump-asmでもあんまりcallは使われてないんだよね
詳しくは知らないけど再帰と言えど少なくともWHNFで値を返すわけだから
サンクに入った再帰呼び出しを実際に再帰的に呼ぶ必要も無いってことだろう
つまり実際の呼び出しに評価元のスタックが使われるんだとしたら
リストを評価する場合には伸びだ分のスタックがコンスセル毎にクリアされる
詳しくは知らないけど再帰と言えど少なくともWHNFで値を返すわけだから
サンクに入った再帰呼び出しを実際に再帰的に呼ぶ必要も無いってことだろう
つまり実際の呼び出しに評価元のスタックが使われるんだとしたら
リストを評価する場合には伸びだ分のスタックがコンスセル毎にクリアされる
887デフォルトの名無しさん
2018/12/20(木) 07:30:09.47ID:y4SKaDG8888デフォルトの名無しさん
2018/12/20(木) 21:14:07.04ID:X0Fr2Ixv これバブルソートじゃなくて挿入ソートだよね
889デフォルトの名無しさん
2018/12/21(金) 00:03:36.39ID:1VggrQKb bsort = unfoldr (uncons . foldr step [])
where step x [] = [x]
step x (y:ys) | x <= y = (x:y:ys)
| otherwise = (y:x:ys)
where step x [] = [x]
step x (y:ys) | x <= y = (x:y:ys)
| otherwise = (y:x:ys)
890デフォルトの名無しさん
2018/12/21(金) 13:18:39.50ID:V4JbVdgQ スタックマシンじゃなくてセルオートマトンだったらスタック消費しないよね
891デフォルトの名無しさん
2018/12/22(土) 08:09:42.23ID:9xYrH7YE Prelude.div関数について。
Preludeモジュールをインポートしないで同義の関数を使いたい場合、
どのモジュールをインポートするのが理にかなっているでしょうか。
理にかなっていると言うのは、
import X (div)
という記述を見て「整数の商を求めるのだな」とか、
「数学的な計算の意味での div なんだな」と分かるという意味です。
import Prelude (div)
では意味が分かりません。
(正確には長年Haskell使ってるので意味は分かるが気持ち悪い)
できるだけ役割がハッキリして仕事が限定された小さなモジュールを求めています。
また stackage の中でお願いします。
basement の Basement.Numerical.Multiplicative.div が良い感じですが、
もっと良いものはあるでしょうか。
Preludeモジュールをインポートしないで同義の関数を使いたい場合、
どのモジュールをインポートするのが理にかなっているでしょうか。
理にかなっていると言うのは、
import X (div)
という記述を見て「整数の商を求めるのだな」とか、
「数学的な計算の意味での div なんだな」と分かるという意味です。
import Prelude (div)
では意味が分かりません。
(正確には長年Haskell使ってるので意味は分かるが気持ち悪い)
できるだけ役割がハッキリして仕事が限定された小さなモジュールを求めています。
また stackage の中でお願いします。
basement の Basement.Numerical.Multiplicative.div が良い感じですが、
もっと良いものはあるでしょうか。
892デフォルトの名無しさん
2018/12/22(土) 09:55:43.41ID:NgVSh9Jk >>888
(y:bs x ys)は遅延評価だから捜査逆のバブルソート
(y:bs x ys)は遅延評価だから捜査逆のバブルソート
893デフォルトの名無しさん
2018/12/22(土) 10:39:40.85 ミ /、`二//-‐''"´::l|::l l! ';!u ';/:::l ', ';::::::l ';:::::i:::::
ニ レ/::/ /:イ:\/l:l l::l u !. l / ';:::l ', ';:::::l. ';::::l:::::
マ レ /:l l:::::lヽ|l l:l し !/ ';:l,、-‐、::::l ';::::l::::
リ /::l l:::::l l\l ヽ-' / ';!-ー 、';::ト、';::::l:::
ス /::::l/l::::lニ‐-、`` / /;;;;;;;;;;;;;ヽ! i::::l:::
ト /i::/ l::l;;;;;ヽ \ i;;;;;;;;;;;;;;;;;;;l l::l:::
/:::l/:l /;;l:!;;;;;;;;;', ';;;;;;;;;;;;;;;;;ノ l:l::
/::::;ィ::l. l;;;;!;;;;;;;;;;;l `‐--‐'´.....:::::::::!l
__|_ ヽヽ /イ//l::l ヽ、;;;;;;;ノ.... し :::::::::::::::::::::ヽ /!リ l
| ー /::::l';!:::::::::::::::::::: u ', i ノ l
| ヽー /イ';::l ’ し u. i l l
| /';:';:!,.イ し 入 l l U
| /,、-'´/ し / ヽ、 u し ,' ,' l
| /l し _,.ノ `フ" ,' ,' ,ィ::/:
| /::::::ヽ ヽ / し ,' ,' / l::
| /::::::::::::`‐、 し ', / u ,、-'´ l,、-
| ``‐-、._::::::::::` ‐ 、 ',/ , -'´`'´ ,-'´
| _,、-‐'"´';:::::::::イ:l';:::` ‐ 、._____,、-‐'"´ u /
| | | | \ l::/ l::::::/リ ';:::::lリ:::::l';:::l l:l:::::l\ u /
| | | |
ニ レ/::/ /:イ:\/l:l l::l u !. l / ';:::l ', ';:::::l. ';::::l:::::
マ レ /:l l:::::lヽ|l l:l し !/ ';:l,、-‐、::::l ';::::l::::
リ /::l l:::::l l\l ヽ-' / ';!-ー 、';::ト、';::::l:::
ス /::::l/l::::lニ‐-、`` / /;;;;;;;;;;;;;ヽ! i::::l:::
ト /i::/ l::l;;;;;ヽ \ i;;;;;;;;;;;;;;;;;;;l l::l:::
/:::l/:l /;;l:!;;;;;;;;;', ';;;;;;;;;;;;;;;;;ノ l:l::
/::::;ィ::l. l;;;;!;;;;;;;;;;;l `‐--‐'´.....:::::::::!l
__|_ ヽヽ /イ//l::l ヽ、;;;;;;;ノ.... し :::::::::::::::::::::ヽ /!リ l
| ー /::::l';!:::::::::::::::::::: u ', i ノ l
| ヽー /イ';::l ’ し u. i l l
| /';:';:!,.イ し 入 l l U
| /,、-'´/ し / ヽ、 u し ,' ,' l
| /l し _,.ノ `フ" ,' ,' ,ィ::/:
| /::::::ヽ ヽ / し ,' ,' / l::
| /::::::::::::`‐、 し ', / u ,、-'´ l,、-
| ``‐-、._::::::::::` ‐ 、 ',/ , -'´`'´ ,-'´
| _,、-‐'"´';:::::::::イ:l';:::` ‐ 、._____,、-‐'"´ u /
| | | | \ l::/ l::::::/リ ';:::::lリ:::::l';:::l l:l:::::l\ u /
| | | |
894デフォルトの名無しさん
2018/12/22(土) 11:38:44.98ID:SGb2VOwM895デフォルトの名無しさん
2018/12/22(土) 15:07:06.49ID:j3oO0IK0896デフォルトの名無しさん
2018/12/23(日) 00:20:58.06ID:OufBT+Yp897デフォルトの名無しさん
2018/12/23(日) 00:50:21.75ID:2lSG181k 型推論って、いったい何を目指してるの?
コンパイラは推論できても、人間にとって読みやすいものと思えないんだけど
コンパイラは推論できても、人間にとって読みやすいものと思えないんだけど
898デフォルトの名無しさん
2018/12/23(日) 02:11:43.05ID:YigQT2JG template<typename T>って宣言してもどうせ読めないから宣言しないのを目指す
899デフォルトの名無しさん
2018/12/23(日) 02:17:29.50ID:zMRMmtKp >>897
関数型言語だと型を考えることがプログラミングだと言うね
関数型言語だと型を考えることがプログラミングだと言うね
900デフォルトの名無しさん
2018/12/23(日) 16:02:25.42ID:dHWagv9n Practical Web Development with Haskellってのがまだ70Pくらいしか読んでないけど
認証つきWebアプリをいちから写経しようぜってつくりで初〜中級者にいい感じっぽい
Data.Hasとかこれで初めて知ったわ
認証つきWebアプリをいちから写経しようぜってつくりで初〜中級者にいい感じっぽい
Data.Hasとかこれで初めて知ったわ
901デフォルトの名無しさん
2018/12/23(日) 19:07:09.70ID:VkAdoKxx902デフォルトの名無しさん
2018/12/23(日) 19:28:31.47ID:14edUGfJ Preludeなんてものは要らなくて、divはData.integralに入ってて、divを使うには毎回Data.Integralからimportするのが理想って認識で合ってる?
Preludeのその他諸々の関数も含めて
Preludeのその他諸々の関数も含めて
903デフォルトの名無しさん
2018/12/23(日) 20:21:12.14ID:YigQT2JG LinuxにたとえるとデフォルトのGUIなんてものは要らなくて
無数のディストリビューションから選択するのが理想という認識
無数のディストリビューションから選択するのが理想という認識
904895
2018/12/23(日) 20:57:49.01ID:gIQVihKw >>901
http://hackage.haskell.org/package/base-4.12.0.0/docs/src/Prelude.html
を読んで思いついたんだけど、
import GHC.Real (div)
はどうだい。プレリュードはそのモジュールをre-exportしてる。
http://hackage.haskell.org/package/base-4.12.0.0/docs/src/Prelude.html
を読んで思いついたんだけど、
import GHC.Real (div)
はどうだい。プレリュードはそのモジュールをre-exportしてる。
905デフォルトの名無しさん
2018/12/24(月) 17:05:01.14ID:ovQS6rqM >>900
Javerが4年で手本になるこなれたコードを書けてるのか疑問なんだがどんな?
Javerが4年で手本になるこなれたコードを書けてるのか疑問なんだがどんな?
906デフォルトの名無しさん
2018/12/24(月) 18:43:23.42ID:ovQS6rqM うわああああこの前Amazon.comから輸入したHaskellの洋書Amazon.co.jpでも売ってたああああ
失敗した
失敗した
907デフォルトの名無しさん
2018/12/24(月) 20:36:56.95ID:OvWyYJqn 当初から比べたらco.jpの洋書の品揃えはずいぶん充実したよね
アカウントを未だ両方持っているけど米版は使わなくなった
アカウントを未だ両方持っているけど米版は使わなくなった
908デフォルトの名無しさん
2018/12/25(火) 11:18:00.52ID:yeWprDEr 洋書なら輸入の方が安いって話では
909デフォルトの名無しさん
2018/12/25(火) 12:11:51.62ID:3tfaERbL 専門書だと、各地域のamazonで送料込みでも一万円近く違ったりするから
確認はしてる。ごく稀にamazon.co.jpが破格になることもあるけど。
haskell関連だと
Computational Oriented Matroids: Equivalence Classes of Matrices within a Natural Framework
Juergen G. Bokowski
をco.jpで2800円で購入してた。他だと1万円超え。いまもco.jpでセールになって5700円で買えるみたい。
なお、haskellの学習にはなんの役にも立たないので、その分野の数学をやりたい場合だけ買ってね。
確認はしてる。ごく稀にamazon.co.jpが破格になることもあるけど。
haskell関連だと
Computational Oriented Matroids: Equivalence Classes of Matrices within a Natural Framework
Juergen G. Bokowski
をco.jpで2800円で購入してた。他だと1万円超え。いまもco.jpでセールになって5700円で買えるみたい。
なお、haskellの学習にはなんの役にも立たないので、その分野の数学をやりたい場合だけ買ってね。
910デフォルトの名無しさん
2018/12/25(火) 22:13:34.24ID:S7Os6UpT >>904
ありがとうございます。
実はそれ、存在は知ってました。
実際インポートできる事も試して知ってます。
ただそのモジュール、base パッケージで公開されていません。
https://www.stackage.org/lts-13.0/package/base-4.12.0.0
これを使うのは、Internal 系モジュールを使うよりもっとヤバくないですか?
ありがとうございます。
実はそれ、存在は知ってました。
実際インポートできる事も試して知ってます。
ただそのモジュール、base パッケージで公開されていません。
https://www.stackage.org/lts-13.0/package/base-4.12.0.0
これを使うのは、Internal 系モジュールを使うよりもっとヤバくないですか?
911デフォルトの名無しさん
2018/12/28(金) 21:37:48.04ID:+Hytqb0t Haskellerって薬漬けのヤベー奴しかいねーのかよwww
http://fumieval.hatenablog.com/entry/2018/12/27/213853
http://fumieval.hatenablog.com/entry/2018/12/27/213853
912デフォルトの名無しさん
2018/12/28(金) 21:49:01.05ID:Wkr1Do53 なんか、Haskellなかなか理解進まない
今は、遅延評価あたりをwebで探して読んでるんだけど、
ここら辺のいい日本語の本無いですか?
キーワードは
遅延評価、サンク、ラムダ式、簡約(出来ればグラフ簡約もあれば)当たりが載ってれば
あとは、コンビネータとかもあるとうれしい
情報系の教科書でも、Haskellの教科書でもどちらも大歓迎
今は、遅延評価あたりをwebで探して読んでるんだけど、
ここら辺のいい日本語の本無いですか?
キーワードは
遅延評価、サンク、ラムダ式、簡約(出来ればグラフ簡約もあれば)当たりが載ってれば
あとは、コンビネータとかもあるとうれしい
情報系の教科書でも、Haskellの教科書でもどちらも大歓迎
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★8 [BFU★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 高市首相が異例の“買春行為の罰則化の検討”に言及…世界では“買う側”に罰則を科すのが先進国のスタンダード ★2 [樽悶★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 【ガチ正論】一般人「中国に規制制裁されて、『中国ムカつく』じゃなくて矛先が『許さんぞ高市』になってる奴、頭おかしいの?」 ★2 [153490809]
- ケーキってどの店で食べても味一緒じゃん?
- 中国「痛撃を加える」ワイ「うわあぁ!何が来るんだ?!」中国「パンダ」 [308389511]
- 陸上自衛隊員(43)逮捕 赤坂ライブハウスの出演女性刺傷 殺人未遂容疑 [377482965]
- 鼻糞の残糞感がずっと消えない
- NHKニュースウオッチ9「日本側は対話にオープンな姿勢で安定した日中関係を築きたい考えなのに中国が意固地で糸口が見いだせない」 [904151406]
