関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/test/read.cgi/tech/1428597032/
探検
関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/01/15(日) 23:43:54.28ID:Vh4eztBk
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 型にシリアライズすれば再コンパイルの問題は解決しますが、
今度は型の不一致や未定義メッセージなどのバグがコンパイル時に発見できなくなり、それもマズいです。
厳格な型システムの恩恵にあずかりながら、かつ不要な再コンパイルを抑えるようなメッセージングシステムの構築方法はないでしょうか。
そのメッセージの種類を増やすことでアプリケーションの機能を拡張する際に、
コンパイルすべきモジュールの数を最小限に抑える方法を探しています。
メッセージングシステムというと大げさかもしれませんが、
たとえば 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のモナドなど分かるはずも無く
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:haBe4Sdm132デフォルトの名無しさん
2017/02/14(火) 07:07:04.56ID:0/yLOI7Z そもそもfoldはループより速い?
133デフォルトの名無しさん
2017/02/14(火) 10:36:57.61ID:CVjuh2pk134デフォルトの名無しさん
2017/02/14(火) 16:50:38.39ID:m6BuE6wx >>133
C
C
135デフォルトの名無しさん
2017/02/14(火) 21:33:40.60ID:jOgsWiWm136デフォルトの名無しさん
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に勝てないけど、いかなる並列・並行処理も否定してない。
データ構造やコンパイラによる。
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で再現できますか?
入力データをそろえなければ「関数程度のレベルの比較」に意味はありません。
速度を比較するための条件をそろえる事ができません。
たとえばプロセスを立ち上げてから処理し終えるまでの時間、
このレベルであれば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
とシンプルに置き換え可能なのですね
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出たけどね。
低レベルのシステム記述も出来たのに
全然普及せんかったで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について語る書の書き方や視点が数学寄りのものが多く理解が難しい(奴らが言うようなこまけえ数学っぽいこと気にせんでもコードは書けるっちゅうに純粋さにこだわりすぎ)
・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:lgZA8NJM153デフォルトの名無しさん
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:nCBINic8156デフォルトの名無しさん
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
++使ってるのが気に食わないのだがうまく消せなかった
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)
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は動的言語なら作れるかも
これだと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)
この関数は一方だけでも無限リストだと止まらないので注意が必要ですが、
ときどき役に立つので私は自分のツールボックスに入れています。
長さが異なるリスト同士の 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
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)
とほぼ同じ
以前にこんなのを書いたことがある
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
http://melpon.org/wandbox/permlink/HLKtAXzGodOF3ZGP
164デフォルトの名無しさん
2017/02/19(日) 10:09:57.42ID:obWbRffz ところで・・・
コメントを読まなくても、どのように計算しているのかがぱっと見て分かる、
それが関数型が持つ高い宣言性の良いところ。
また、そのようにプログラムしても、もともとGHCが持つ優秀な最適化能力や、
プログラムの見た目を壊すことなく最適化を促すことができる仕組みのおかげで、
結果的にかなり効率の良い処理がなされる実行ファイルが出力される。
(実用的なアプリケーションで十分に耐えられる)
にも関わらず、そのメリットをあえて潰すようなプログラムをする人が稀にいるが、
純粋関数型のHaskellを使っておきながら、他に優先すべき事項があるのだろうか。
まぁ、縛りパズルをして遊んでいるのなら分かるが。
コメントを読まなくても、どのように計算しているのかがぱっと見て分かる、
それが関数型が持つ高い宣言性の良いところ。
また、そのようにプログラムしても、もともと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変数以上になると完全に暗号めいてて困る
(中間変数が無くなるから効率が上がるという話もある、
そのくらい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重ループ
それと再帰のために自分自身に名前をつけた時点でポイントフリーは諦めている筈
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
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:bFWxmJHr172デフォルトの名無しさん
2017/02/20(月) 20:56:54.49ID:uIdMc98M ArrowLoopがどういうインターフェイスなのかいまいちよく分からないけど
その定義でどう動くかはfによるとしか・・・
その定義でどう動くかはfによるとしか・・・
173デフォルトの名無しさん
2017/02/20(月) 22:57:03.60ID:tib6qfwe 結局ハードウェアの動きとあまりに乖離しすぎてるってのが
普及しない理由じゃないかと。
普及しない理由じゃないかと。
174デフォルトの名無しさん
2017/02/21(火) 04:45:41.06ID:bkUsfADx 量子コンピュータが普及する時は言語どうなるんかな
CPUに合わせた新しい言語になるのか、今の言語をベースにコンパイラに任せるのか
原理とか全く知らなくて言ってるけど
CPUに合わせた新しい言語になるのか、今の言語をベースにコンパイラに任せるのか
原理とか全く知らなくて言ってるけど
175デフォルトの名無しさん
2017/02/21(火) 11:55:34.70ID:hz5m2IGZ メモリとCPUが分離しすぎているおかげでメモリ上のデータ構造に変化がない
OOPははそこを変えようとしたのか
分離するのやめれば破壊的イノベーションが起きるのではと
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/5A179デフォルトの名無しさん
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
問題の本質を以下の単純化したコードで例示します
最後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に御執心の様子
最近はRustに御執心の様子
182デフォルトの名無しさん
2017/02/24(金) 02:19:21.58ID:bZ+UJBqj >>179
OldAとUsefulFooとNewAの設計方針が間違っていたのでは?
OldAとUsefulFooとNewAの設計方針が間違っていたのでは?
183デフォルトの名無しさん
2017/02/24(金) 11:52:40.03ID:e/BP7pNw 最新のGHCは簡単な余再帰が末尾再帰に変換されて最適化かかるの?
184デフォルトの名無しさん
2017/02/25(土) 01:04:24.08ID:wcM+rtIC185デフォルトの名無しさん
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のフィボナッチとか完全に霞んで見える。
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)だけどな
それは
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 したライブラリを使用するには、
どうすればよいのでしょうか。
(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/SjR0194デフォルトの名無しさん
2017/03/01(水) 13:33:54.14ID:5kGyNHm4 諸君、議論したまえ
195デフォルトの名無しさん
2017/03/02(木) 08:35:24.25ID:jHvj97KG196デフォルトの名無しさん
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
あの人、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構文の<-の関係も載ってた。
証明問題が多く、数学がわかんないときつい感じ。
最初から正格、非正格を念頭に置いた上で議論が進んでいく。その時点で既に毛色が違う。
豆知識として、リスト内包表記とdo構文の<-の関係も載ってた。
証明問題が多く、数学がわかんないときつい感じ。
206デフォルトの名無しさん
2017/03/07(火) 20:23:58.44ID:36OrCepo207デフォルトの名無しさん
2017/03/08(水) 06:06:40.10ID:XWjfITmE208デフォルトの名無しさん
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/
週末に人気のあるプログラミング言語(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 定理証明支援系はいつですか?
212resumi
2017/03/12(日) 01:08:56.73ID:f0Kjw9v5213デフォルトの名無しさん
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
もしくはそれ以外にも方法はあるのでしょうか
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秒です!)
もっと速く読み込む方法はありませんか?
(但し標準入力からとします)
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だった
うろ覚えだったすまん
うろ覚えだったすまん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★11 [樽悶★]
- 「日本はパンダがいなくなる状況に直面するだろう」 中国メディア、専門家の見方伝える [♪♪♪★]
- 外国人の犯罪率は日本人の1.72倍 警察庁が短期滞在者除いた数字を参院内閣委で答弁★2 [七波羅探題★]
- 【日中対立】 朝日新聞のタイトル修正が中国逆ギレの火種か SNSで批判相次ぐ [♪♪♪★]
- 朝日新聞のタイトル修正が中国逆ギレの火種か SNSで批判相次ぐ★2 [♪♪♪★]
- 「ドラゴンボール」初の全世界キャラクター人気投票が開幕!212キャラからナンバーワンが決まる!! [ひかり★]
- ワチが一番キライなスポーツ1つ当ててみ
- ウインナーを最初に考えた奴ってサイコパスだよな
- 16のヒッキー女に構って
- ネトウヨ「レアアースは日本でも採れるから輸入しなくてもOK!」 なお精製コストがバカ高く有害物質が大量に出ることは全く知らない模様 [314039747]
- 【すべてが】𝗮𝗺͜𝗮͉𝘇𝗼𝗻ブラックフライデーSALE総合【いいだろ!】 [194819832]
- 国籍答えろ!嫌儲民!! [279254606]
