関数型プログラミング言語 Haskell について語るスレです。
Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part32
https://mevius.5ch.net/test/read.cgi/tech/1548720347/
関数型プログラミング言語Haskell Part33
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/02/10(月) 18:17:36.49ID:L6eYQqyh641デフォルトの名無しさん
2021/01/13(水) 21:12:21.98ID:DinE+zFR >>640
パズルソルバー
パズルソルバー
642デフォルトの名無しさん
2021/01/13(水) 22:41:38.73ID:CNkC++cr 感情は先入観から生じ
先入観を克服することで知性に至る
先入観を克服することで知性に至る
643デフォルトの名無しさん
2021/01/14(木) 00:13:44.79ID:JY+VfWVO でも先入観のメリットはスピードだから
速度の最適化みたいな建前を用意すれば知性と知性の対等な関係にはなる
建前はキモいとか本音がカッコイイとか言い出さない限り
速度の最適化みたいな建前を用意すれば知性と知性の対等な関係にはなる
建前はキモいとか本音がカッコイイとか言い出さない限り
644デフォルトの名無しさん
2021/01/14(木) 07:11:45.05ID:UC/QgsCt 感情のための知性が工学
知性のための知性が理学
知性のための知性が理学
645デフォルトの名無しさん
2021/01/14(木) 08:24:32.45ID:mp+NLhBe なんかやたらポエムを書きたがるレスが増えたな
646デフォルトの名無しさん
2021/01/14(木) 10:42:33.32ID:ApYxPV7C 音やリズムをデザインしてるのか
音読できない言文不一致言語があれば、デザインと論理的構造を分離できそう
音読できない言文不一致言語があれば、デザインと論理的構造を分離できそう
647デフォルトの名無しさん
2021/01/15(金) 04:12:13.96ID:NAFJshBl これ意見割れてるけどどっちが正しいの?
有識者諸君のご意見を伺いたい
https://www.quora.com/Is-functional-programming-most-likely-to-survive-transitions-to-different-CPU-architectures-like-post-von-neumann-ones
有識者諸君のご意見を伺いたい
https://www.quora.com/Is-functional-programming-most-likely-to-survive-transitions-to-different-CPU-architectures-like-post-von-neumann-ones
648デフォルトの名無しさん
2021/01/15(金) 10:43:33.32ID:l3Q+U92p 関数型を信じるというよりオブジェクト指向を疑うべき
オブジェクト間の通信がただの関数呼び出しから軽量スレッドに変わったらどうなるか等
オブジェクト間の通信がただの関数呼び出しから軽量スレッドに変わったらどうなるか等
649デフォルトの名無しさん
2021/01/15(金) 20:09:59.52ID:SSKXVcKf >>648
重たくなる。
重たくなる。
650デフォルトの名無しさん
2021/01/16(土) 10:01:48.97ID:fPN57ROF fix関数は least-defined な不動点を見つけるそうだけど、
この least-defined ってどういう意味?
この least-defined ってどういう意味?
651デフォルトの名無しさん
2021/01/16(土) 10:43:22.09ID:lq2o0P8I おれの先入観によるとポインタの循環の周期が最小
652デフォルトの名無しさん
2021/01/20(水) 07:45:01.78ID:0A31ygkk 多分できないんだろうなと思いつつ質問です
あるページで乱数をいっぱい調達する方法でこんなのありました
randIntsList = let
getOne rec = ( return . ( : rec ) )
=<< ( randomIO :: IO Int )
in iterate ( >>= getOne ) ( return [ ] )
main = do
a <- ( return . head ) =<< randIntsList !! 100
print a
コレはもちろんうまく行きました
でもコレちょっと不愉快です
IO [ Int ] とかで例えば
randInts :: IO [ Int ]
randInts = do
hd <- ( randomIO :: IO Int )
tl <- randInts
return $ hd : tl
main = do
a <- ( return . head ) =<< randInts
print a
とかであらかじめ使う数を指定しないで好きなだけとってくるとかできないもんでしょうか?
上のはGHCで参照すると実行時エラー出ます
あるページで乱数をいっぱい調達する方法でこんなのありました
randIntsList = let
getOne rec = ( return . ( : rec ) )
=<< ( randomIO :: IO Int )
in iterate ( >>= getOne ) ( return [ ] )
main = do
a <- ( return . head ) =<< randIntsList !! 100
print a
コレはもちろんうまく行きました
でもコレちょっと不愉快です
IO [ Int ] とかで例えば
randInts :: IO [ Int ]
randInts = do
hd <- ( randomIO :: IO Int )
tl <- randInts
return $ hd : tl
main = do
a <- ( return . head ) =<< randInts
print a
とかであらかじめ使う数を指定しないで好きなだけとってくるとかできないもんでしょうか?
上のはGHCで参照すると実行時エラー出ます
653デフォルトの名無しさん
2021/01/20(水) 14:24:39.71ID:7SUaJKsz ついさっき関数的プログラミングの話題してたが
やっぱり通じないな
関数?そりゃ関数くらい普通に書くよねw
副作用?必要なら出ないように書けばいいんじゃないの?どうでもよくない?
純粋関数の考え方?そんなのいらないよねw
部分適用?今までそんなの必要になったことないなあw そんなの何に使うんだ?
まあ言われてみれば誰にでもわかるような利点を提示できないってのは確かにあるが・・
利点がないなら好みの範囲で片付けられちゃったな
やっぱり通じないな
関数?そりゃ関数くらい普通に書くよねw
副作用?必要なら出ないように書けばいいんじゃないの?どうでもよくない?
純粋関数の考え方?そんなのいらないよねw
部分適用?今までそんなの必要になったことないなあw そんなの何に使うんだ?
まあ言われてみれば誰にでもわかるような利点を提示できないってのは確かにあるが・・
利点がないなら好みの範囲で片付けられちゃったな
654デフォルトの名無しさん
2021/01/20(水) 15:57:32.54ID:ztk5BuHj いらないと思う人は使わなければいいし気にしなければいいってだけだよね
655デフォルトの名無しさん
2021/01/20(水) 16:39:30.61ID:IzsyJlfZ >>652
これでどうかな?
randInts2 :: [IO Int]
randInts2 =
iterate ( >>= const (randomIO :: IO Int) ) (randomIO :: IO Int)
main :: IO ()
main = do
a <- head randInts2
print a
これでどうかな?
randInts2 :: [IO Int]
randInts2 =
iterate ( >>= const (randomIO :: IO Int) ) (randomIO :: IO Int)
main :: IO ()
main = do
a <- head randInts2
print a
656デフォルトの名無しさん
2021/01/20(水) 17:07:44.96ID:aAR5bcpB >>653
いわれてみればhaskell触るまでこういう特徴が泣くほどうれしいなんて思ってなかったなぁ……
いわれてみればhaskell触るまでこういう特徴が泣くほどうれしいなんて思ってなかったなぁ……
657デフォルトの名無しさん
2021/01/20(水) 17:39:40.94ID:kKr2IDUq >>653
利点を提示っていうかLispとHaskellの違いを提示する必要がある
Lispの利点を再現するだけならPythonで十分な気がする
しかしHaskellを再現できるものがまだ出てこない
それは関数型じゃなくて静的型の説明をしないと意味が分からないと思うけど
利点を提示っていうかLispとHaskellの違いを提示する必要がある
Lispの利点を再現するだけならPythonで十分な気がする
しかしHaskellを再現できるものがまだ出てこない
それは関数型じゃなくて静的型の説明をしないと意味が分からないと思うけど
658デフォルトの名無しさん
2021/01/20(水) 18:38:17.88ID:apYLuAz7 >>655
ありがとうございます
そうなんです
今のところそれしか解決策ないんです
しかし希望では IO [ Int ] であって欲しいんです
イメージとしてはこうです
ある関数 f があって乱数で挙動が変わって欲しい
もちろん最終的にはIOモナドを使わないとしょうがない
しかし色々いじってる段階ではモナド被せないで代わりに擬似乱数無限配列 psuedRand :: [ Int ] みたいなのを食わせて
f a b c psuedRand
みたいに呼び出して色々頑張って、最後の最後にIOモナドで実地に
( return . f a b c ) =<< realRand
に切り替えるみたいな事ができないかなと思ったんです
f が使用する乱数がある程度わかるので別に無限列でなくてもいいっちゃいいんですけど
今一歩モナドに包まれてる関数いっぱい出てくるの好きじゃないんですよ
通のホムペとか見てるとむしろバンバンモナドでくるんどいた方がいいみたいなのもみるんですけどねぇ
ありがとうございます
そうなんです
今のところそれしか解決策ないんです
しかし希望では IO [ Int ] であって欲しいんです
イメージとしてはこうです
ある関数 f があって乱数で挙動が変わって欲しい
もちろん最終的にはIOモナドを使わないとしょうがない
しかし色々いじってる段階ではモナド被せないで代わりに擬似乱数無限配列 psuedRand :: [ Int ] みたいなのを食わせて
f a b c psuedRand
みたいに呼び出して色々頑張って、最後の最後にIOモナドで実地に
( return . f a b c ) =<< realRand
に切り替えるみたいな事ができないかなと思ったんです
f が使用する乱数がある程度わかるので別に無限列でなくてもいいっちゃいいんですけど
今一歩モナドに包まれてる関数いっぱい出てくるの好きじゃないんですよ
通のホムペとか見てるとむしろバンバンモナドでくるんどいた方がいいみたいなのもみるんですけどねぇ
659デフォルトの名無しさん
2021/01/20(水) 18:57:39.14ID:IzsyJlfZ660デフォルトの名無しさん
2021/01/20(水) 19:04:15.17ID:apYLuAz7661デフォルトの名無しさん
2021/01/20(水) 20:02:19.54ID:kKr2IDUq headやtailの戻り値の型はIOではないって宣言してるから
リスト処理中にrandomIOができなかったとしても不思議ではない
型を宣言するってそういうことよ
リスト処理中にrandomIOができなかったとしても不思議ではない
型を宣言するってそういうことよ
662デフォルトの名無しさん
2021/01/20(水) 21:15:09.40ID:jArj32vs >>658
やりたい事の本質がいまいち分かりません。
2点確認します。
ひとつめ。
結局のところ今は [a] 型の乱数を返す関数を作りたいのでしょうか。
それとも、IO [a] 型の乱数を返す関数を作りたいのでしょうか。
はたまた、両方でしょうか。
ふたつめ。
開発環境では
> f a b c psuedRand
本番環境では
> ( return . f a b c ) =<< realRand
という事でしょうか。
前者は純粋関数の式、後者は IO モナドを伴う式です。
これは、本番環境で IO モナドな関数を、開発環境では純粋関数で開発するという事ですよね。
開発環境を本番環境にする際には、後者の式を呼び出している外側の関数も、
純粋関数から IO モナドに書き換えるのでしょうか。
あまりお勧めしません。
本番環境で IO モナドな関数は、開発時も IO モナドで開発&テストした方が良いと思います。
環境が違ってもインターフェース(型シグネチャ)はそろえた方が良いです。
事情がおありなので、あくまで私は勧めないというだけですけど。
やりたい事の本質がいまいち分かりません。
2点確認します。
ひとつめ。
結局のところ今は [a] 型の乱数を返す関数を作りたいのでしょうか。
それとも、IO [a] 型の乱数を返す関数を作りたいのでしょうか。
はたまた、両方でしょうか。
ふたつめ。
開発環境では
> f a b c psuedRand
本番環境では
> ( return . f a b c ) =<< realRand
という事でしょうか。
前者は純粋関数の式、後者は IO モナドを伴う式です。
これは、本番環境で IO モナドな関数を、開発環境では純粋関数で開発するという事ですよね。
開発環境を本番環境にする際には、後者の式を呼び出している外側の関数も、
純粋関数から IO モナドに書き換えるのでしょうか。
あまりお勧めしません。
本番環境で IO モナドな関数は、開発時も IO モナドで開発&テストした方が良いと思います。
環境が違ってもインターフェース(型シグネチャ)はそろえた方が良いです。
事情がおありなので、あくまで私は勧めないというだけですけど。
663デフォルトの名無しさん
2021/01/20(水) 21:21:29.93ID:apYLuAz7664デフォルトの名無しさん
2021/01/20(水) 21:52:28.04ID:kKr2IDUq >>663
型を書かない言語も普通に存在するので、型を無視する方法があってもそれも不思議ではない
型を書かない言語も普通に存在するので、型を無視する方法があってもそれも不思議ではない
665デフォルトの名無しさん
2021/01/20(水) 23:15:01.74ID:Sb+ElJSJ666デフォルトの名無しさん
2021/01/21(木) 00:38:31.39ID:HkuQh/W6 >>653
副作用とか純粋関数の話は単体テストの話題と絡めたいね
それが通じなかったら知らん
部分適用というか高階関数の話は
コールバックとかイテレータのような「処理の抽象化」が
極めて書きやすくなるというような話でどうか
副作用とか純粋関数の話は単体テストの話題と絡めたいね
それが通じなかったら知らん
部分適用というか高階関数の話は
コールバックとかイテレータのような「処理の抽象化」が
極めて書きやすくなるというような話でどうか
667デフォルトの名無しさん
2021/01/21(木) 06:01:52.78ID:mwzMDOkA Haskellで厳しく性能を最適化しようとすると
抽象的なところで実装を意識したコードを書くことになって苦労する
みたいなレビューがあった
Haskellはベンチ結果良いように見えて
その手の「実装を意識したコード」がベンチ用に書かれるからで
実際は割と遅めなんだな
抽象的なところで実装を意識したコードを書くことになって苦労する
みたいなレビューがあった
Haskellはベンチ結果良いように見えて
その手の「実装を意識したコード」がベンチ用に書かれるからで
実際は割と遅めなんだな
668デフォルトの名無しさん
2021/01/21(木) 06:07:07.88ID:LkrjH2wS >>667
そのレビューのURLを貼っていただけないでしょうか
そのレビューのURLを貼っていただけないでしょうか
669デフォルトの名無しさん
2021/01/21(木) 06:30:57.22ID:mwzMDOkA https://stackoverflow.com/questions/35027952/why-is-haskell-ghc-so-darn-fast
この辺
> thanks for the link.
80 lines is what I called "low-level style of programming not much different than
programming in C itself." . "the higher level code",
that would be the "stupid" fmap (length &&& length .
words &&& length . lines) readFile.
If that was faster than (or even comparable to) C,
the hype here would be totally justified then.
We still need to work hard for speed in Haskell as in C, is the point.
>>605もそんなことをかいてる
この辺
> thanks for the link.
80 lines is what I called "low-level style of programming not much different than
programming in C itself." . "the higher level code",
that would be the "stupid" fmap (length &&& length .
words &&& length . lines) readFile.
If that was faster than (or even comparable to) C,
the hype here would be totally justified then.
We still need to work hard for speed in Haskell as in C, is the point.
>>605もそんなことをかいてる
670デフォルトの名無しさん
2021/01/21(木) 06:38:11.58ID:mwzMDOkA 以下の厳密というのは遅延評価じゃなくするという事だろう?
しかも「プロファイルを作成して改善」は一度アプリを書いてから実行の様子を観察して最適化していくという事だろう。
抽象的にHaskellらしく書いていきなり速いというわけではないという事だ。
プロファイラーでボトルネックを特定して特殊なコードに変えていけば速くなる、と。
>はい、怠惰はおそらくナイーブなHaskellが遅い最大の理由であり、
最適化されたHaskellでさえ速度の点で信頼できない可能性があります。
そのため、パフォーマンスが重要なアプリケーションにはお勧めしません。
OCamlの方が適しています。繰り返しになりますが、
HaskellをBangPatternsなどで厳密にすることはそれほど難しくありません。
また、コードの読み取りや保守が難しくなることもありません。
したがって、パフォーマンスが望ましいが、遅いプロトタイプでも問題がない場合は、
Haskellが非常に良い選択です。うまく機能するものを一緒にハックしてから、
プロファイルを作成して改善します。
しかも「プロファイルを作成して改善」は一度アプリを書いてから実行の様子を観察して最適化していくという事だろう。
抽象的にHaskellらしく書いていきなり速いというわけではないという事だ。
プロファイラーでボトルネックを特定して特殊なコードに変えていけば速くなる、と。
>はい、怠惰はおそらくナイーブなHaskellが遅い最大の理由であり、
最適化されたHaskellでさえ速度の点で信頼できない可能性があります。
そのため、パフォーマンスが重要なアプリケーションにはお勧めしません。
OCamlの方が適しています。繰り返しになりますが、
HaskellをBangPatternsなどで厳密にすることはそれほど難しくありません。
また、コードの読み取りや保守が難しくなることもありません。
したがって、パフォーマンスが望ましいが、遅いプロトタイプでも問題がない場合は、
Haskellが非常に良い選択です。うまく機能するものを一緒にハックしてから、
プロファイルを作成して改善します。
671デフォルトの名無しさん
2021/01/21(木) 08:18:51.22ID:mwzMDOkA こういう認識
・Haskellはコードだけでは最適化ポイントを見つけれない
・最適化したら変なコードになる
・普通のHaskellコードはベンチで他言語に惨敗する
・Haskellはコードだけでは最適化ポイントを見つけれない
・最適化したら変なコードになる
・普通のHaskellコードはベンチで他言語に惨敗する
672デフォルトの名無しさん
2021/01/21(木) 09:21:08.07ID:mwzMDOkA これも
・最適化の方法が処理系(GHC)次第で決まり、プログラマーの認識内に無い。
GHCに対してひたすらトライアンドエラー
・最適化の方法が処理系(GHC)次第で決まり、プログラマーの認識内に無い。
GHCに対してひたすらトライアンドエラー
673デフォルトの名無しさん
2021/01/21(木) 21:44:08.46ID:AWFMWVQb ・Haskellが欲しかったポジションはなんかPythonにとられてしまった
674デフォルトの名無しさん
2021/01/22(金) 00:20:12.86ID:IysdrbOG HaskellとPythonは似ていないから両方使ってもDRYに違反しない
似たもの同士で馴れ合い、異質なもの同士を分断するやつは信用できないが
Pythonは似たもの同士でしっかり競争して生き残ったやつだから信用できる
似たもの同士で馴れ合い、異質なもの同士を分断するやつは信用できないが
Pythonは似たもの同士でしっかり競争して生き残ったやつだから信用できる
675デフォルトの名無しさん
2021/01/22(金) 01:34:45.31ID:Zh6FWeVu pythonがなかったとしてもhaskellがそのポジションになることはなかっただろう
676デフォルトの名無しさん
2021/01/22(金) 02:27:11.57ID:XLcorGPG 欲しかったHaskell
・型を最大限に活用、バグが無いことを保証しつつ自然にC言語並みの性能も出る
・型を最大限に活用、バグが無いことを保証しつつ自然にC言語並みの性能も出る
677デフォルトの名無しさん
2021/01/22(金) 08:04:15.32ID:RWrydEj5 Haskellerのキモオタ「シグネチャァ」
678デフォルトの名無しさん
2021/01/22(金) 12:35:37.28ID:Erx3tlcS 醜悪な表現が得意な奴って、綺麗な表現だとポエムとか言われる恐怖を煽られた結果なのかなと
ふと思った
ふと思った
679デフォルトの名無しさん
2021/01/23(土) 13:17:02.46ID:u7XOzuV6 >>665
ListT を使えばと思ったけどだめだった。
・参考
https://blog.mudatobunka.org/entry/2018/01/03/233314
・残骸
module Rand2 where
-- stack install list-t
-- stack exec ghci
import Control.Monad.IO.Class ( liftIO )
import ListT ( ListT, toList )
import System.Random ( Random(randomIO, randomRIO) )
t1 :: ListT IO Int
t1 = return 3
t2 :: ListT IO Int
t2 = liftIO (randomIO :: IO Int)
t3 :: ListT IO [Int]
t3 = repeat <$> t2
output :: ListT IO [Int] -> IO ()
output t3 = do
li0 <- toList t3
print $ take 10 $ head li0
ListT を使えばと思ったけどだめだった。
・参考
https://blog.mudatobunka.org/entry/2018/01/03/233314
・残骸
module Rand2 where
-- stack install list-t
-- stack exec ghci
import Control.Monad.IO.Class ( liftIO )
import ListT ( ListT, toList )
import System.Random ( Random(randomIO, randomRIO) )
t1 :: ListT IO Int
t1 = return 3
t2 :: ListT IO Int
t2 = liftIO (randomIO :: IO Int)
t3 :: ListT IO [Int]
t3 = repeat <$> t2
output :: ListT IO [Int] -> IO ()
output t3 = do
li0 <- toList t3
print $ take 10 $ head li0
680デフォルトの名無しさん
2021/01/23(土) 22:12:27.68ID:u7XOzuV6 >>679
できたー!
module Rand2 where
-- stack install list-t
-- stack exec ghci
import Control.Monad.IO.Class ( liftIO )
import ListT ( ListT, toList, cons, take )
import System.Random ( Random(randomIO) )
t2 :: ListT IO Int
t2 = liftIO (randomIO :: IO Int)
t3 :: ListT IO Int
t3 = do
x <- t2
cons x t3
output :: IO ()
output = do
li <- toList $ ListT.take 10 t3
print li
{-
*Rand2> output
[7616927328998369033,6970782903781268443,-1509938769401207081,-2789264750098693865,-6524417077297424569,8403979199680420436,-3097298192134792937,-2736699795503652525,-4754186463647322678,5658901448509988002]
-}
できたー!
module Rand2 where
-- stack install list-t
-- stack exec ghci
import Control.Monad.IO.Class ( liftIO )
import ListT ( ListT, toList, cons, take )
import System.Random ( Random(randomIO) )
t2 :: ListT IO Int
t2 = liftIO (randomIO :: IO Int)
t3 :: ListT IO Int
t3 = do
x <- t2
cons x t3
output :: IO ()
output = do
li <- toList $ ListT.take 10 t3
print li
{-
*Rand2> output
[7616927328998369033,6970782903781268443,-1509938769401207081,-2789264750098693865,-6524417077297424569,8403979199680420436,-3097298192134792937,-2736699795503652525,-4754186463647322678,5658901448509988002]
-}
681デフォルトの名無しさん
2021/01/24(日) 10:57:12.77ID:EEhZoft7 自分の理解が根本的に間違ってるかもしれんけど
haskellは宣言型で実効順序が定まっていないみたいな話を聞いたんだけど
do記法は普通に上から下に実行されるというイメージになるの?
main = do
x <- readLn
x2 <- readLn
こういう風に書いた場合、最初に入力したものがxに入り、その順番は入れ替えれないはず
do記法はほとんど命令型じゃないの?
IOモナドとかに入力されていくアクション列はその順番を入れ替えれないよね?
どんな感じでコーディングされてるか知らないけど
副作用があるところでは順番を入れ替えれないはず、即ち命令型と大差ないはず
haskellは宣言型で実効順序が定まっていないみたいな話を聞いたんだけど
do記法は普通に上から下に実行されるというイメージになるの?
main = do
x <- readLn
x2 <- readLn
こういう風に書いた場合、最初に入力したものがxに入り、その順番は入れ替えれないはず
do記法はほとんど命令型じゃないの?
IOモナドとかに入力されていくアクション列はその順番を入れ替えれないよね?
どんな感じでコーディングされてるか知らないけど
副作用があるところでは順番を入れ替えれないはず、即ち命令型と大差ないはず
682デフォルトの名無しさん
2021/01/24(日) 12:14:30.84ID:3w4a632B683デフォルトの名無しさん
2021/01/24(日) 13:21:27.07ID:vsDmG4Mq >>681
do記法という言語機能は、上から下への命令の実行を記述するものではない
モナドの組み合わせ方を宣言しているだけ
IOのようなモナドの定義に対してはたまたま命令型言語のようになるだけ
言語レベルで命令を上から下へ実行しているわけではない
do記法という言語機能は、上から下への命令の実行を記述するものではない
モナドの組み合わせ方を宣言しているだけ
IOのようなモナドの定義に対してはたまたま命令型言語のようになるだけ
言語レベルで命令を上から下へ実行しているわけではない
684デフォルトの名無しさん
2021/01/24(日) 15:49:32.04ID:EEhZoft7 じゃあ標準入力から来た文字列の1行目と2行目を分けて扱うにはどう書くの?
685デフォルトの名無しさん
2021/01/24(日) 16:19:42.60ID:QSDOehpN ListT.toListの引数には有限のリストしか渡せないんだろう多分
現に
li <- toList t3
print (take 10 li)
ではなく
li <- toList $ ListT.take 10 t3
print li
と書いてある
現に
li <- toList t3
print (take 10 li)
ではなく
li <- toList $ ListT.take 10 t3
print li
と書いてある
686デフォルトの名無しさん
2021/01/24(日) 16:51:40.79ID:o8L11MsB >>685
> ListT.toListの引数には有限のリストしか渡せないんだろう多分
> 現に
> li <- toList t3
> print (take 10 li)
> ではなく
> li <- toList $ ListT.take 10 t3
> print li
> と書いてある
確認したところ、おっしゃる通り、
前者では応答が返ってきませんでした。
(ListT.repeat でも同じ結果だったので、t3 が悪いのではないです)
> ListT.toListの引数には有限のリストしか渡せないんだろう多分
これで合っていると思います。
> ListT.toListの引数には有限のリストしか渡せないんだろう多分
> 現に
> li <- toList t3
> print (take 10 li)
> ではなく
> li <- toList $ ListT.take 10 t3
> print li
> と書いてある
確認したところ、おっしゃる通り、
前者では応答が返ってきませんでした。
(ListT.repeat でも同じ結果だったので、t3 が悪いのではないです)
> ListT.toListの引数には有限のリストしか渡せないんだろう多分
これで合っていると思います。
687デフォルトの名無しさん
2021/01/24(日) 23:50:31.64ID:3w4a632B やっぱり無理なんですかねぇ?
例えば以下は通るので ”IO 無限リスト” が原理的に無理なわけではないとは思うんですけど
list = return $ repeat '3'
main = do
x <- list
print $ take 10 x
何がどう違うもんなんでしょう?
例えば以下は通るので ”IO 無限リスト” が原理的に無理なわけではないとは思うんですけど
list = return $ repeat '3'
main = do
x <- list
print $ take 10 x
何がどう違うもんなんでしょう?
688デフォルトの名無しさん
2021/01/25(月) 09:17:23.58ID:xOoQiCMv すいません
無限ランダム整数列の件ですが方法がありました
というかSystem.Randomの中に最初から用意されてました
自作でランダム有限列作っておられた方のブログ見つけたので無限列なんて用意されてないとすっかり思い込んでました
以下の方法で1〜10の長さ100の乱数列が簡単に作れるようです
第一引数に値の範囲、第二引数に乱数の種を仕込みます
乱数の種は
mkStdGen :: Int -> StdGen
や
getStdGen :: IO StdGen
newStdGen :: IO StdGenSource
で作成すれば良いようです
乱数の型はIntだけでなくDoubleなどでも作れるようです
----
import System.Random
randomInts :: StdGen -> [ Int ]
randomInts = randomRs (1,10)
main = do
ris <- ( return . randomInts ) =<< getStdGen
print $ take 100 ris
無限ランダム整数列の件ですが方法がありました
というかSystem.Randomの中に最初から用意されてました
自作でランダム有限列作っておられた方のブログ見つけたので無限列なんて用意されてないとすっかり思い込んでました
以下の方法で1〜10の長さ100の乱数列が簡単に作れるようです
第一引数に値の範囲、第二引数に乱数の種を仕込みます
乱数の種は
mkStdGen :: Int -> StdGen
や
getStdGen :: IO StdGen
newStdGen :: IO StdGenSource
で作成すれば良いようです
乱数の型はIntだけでなくDoubleなどでも作れるようです
----
import System.Random
randomInts :: StdGen -> [ Int ]
randomInts = randomRs (1,10)
main = do
ris <- ( return . randomInts ) =<< getStdGen
print $ take 100 ris
689デフォルトの名無しさん
2021/01/25(月) 09:36:17.94ID:lGPRZ7j1 種が IO だから、
randomRs の戻りは [a] なんだね
randomRs の戻りは [a] なんだね
690デフォルトの名無しさん
2021/01/25(月) 11:51:44.88ID:crCxtFmd ライブラリは暗記ですが、数学は暗記ですか?っていう定番のあれだな
691デフォルトの名無しさん
2021/01/25(月) 13:32:32.62ID:/TZZteD8692デフォルトの名無しさん
2021/01/25(月) 13:33:07.46ID:/TZZteD8 安価ミス>>688
693デフォルトの名無しさん
2021/01/27(水) 00:16:50.20ID:UiZI3fhW dp の質問です
haskell でdynamic programing する方法の例でFibonacci数列の計算を
fib = 0:1:( zipWith ( + ) ( drop 0 fib ) ( drop 1 fib ) )
で計算させるというテクニックを紹介しているページがあってなるほどなぁと感心しました
で同じテクニック使ってcomb6 !!i !! jが二項係数C[i, j]になる配列
comb6 = ( ( 1 : ( repeat 0 ) ) : )
$ zipWith ( zipWith ( + ) ) comb6 ( map ( 0 : ) comb6 )
を作ってみました
コレはうまくいきます
comb6 !! 2000 !! 1000
とかも一瞬で計算してくれます
でcomb7 !! i !! j が二項係数C[ i+ j, i ]となる配列comb7を
comb7 = ( ( repeat 1 ) : )
$ zipWith ( zipWith ( + ) )
( comb7 )
( tail $ map ( 1 : ) $ comb7 )
と定義してやってみると、compileまでは通るのですが実行comb!!1!!0すると<<loop>>と言われて止まってしまいます
しかし手計算で展開してみてもloopしてないと思うんですけどどこがおかしいのかわかりません
どなたかわかりませんでしょうか?
haskell でdynamic programing する方法の例でFibonacci数列の計算を
fib = 0:1:( zipWith ( + ) ( drop 0 fib ) ( drop 1 fib ) )
で計算させるというテクニックを紹介しているページがあってなるほどなぁと感心しました
で同じテクニック使ってcomb6 !!i !! jが二項係数C[i, j]になる配列
comb6 = ( ( 1 : ( repeat 0 ) ) : )
$ zipWith ( zipWith ( + ) ) comb6 ( map ( 0 : ) comb6 )
を作ってみました
コレはうまくいきます
comb6 !! 2000 !! 1000
とかも一瞬で計算してくれます
でcomb7 !! i !! j が二項係数C[ i+ j, i ]となる配列comb7を
comb7 = ( ( repeat 1 ) : )
$ zipWith ( zipWith ( + ) )
( comb7 )
( tail $ map ( 1 : ) $ comb7 )
と定義してやってみると、compileまでは通るのですが実行comb!!1!!0すると<<loop>>と言われて止まってしまいます
しかし手計算で展開してみてもloopしてないと思うんですけどどこがおかしいのかわかりません
どなたかわかりませんでしょうか?
694デフォルトの名無しさん
2021/01/27(水) 11:32:01.04ID:fGEABlaN comb7 = x : xs
xs = zipWith f comb7 ys
ys = tail zs
zs = map g comb7
zs = map g (x : xs)
= g x : map g xs
ys = tail (g x : map g xs)
= map g xs
xs = zipWith f comb7 (map g xs) -- ここで(map g xs)のパターンマッチができない
xs = zipWith f comb7 ys
ys = tail zs
zs = map g comb7
zs = map g (x : xs)
= g x : map g xs
ys = tail (g x : map g xs)
= map g xs
xs = zipWith f comb7 (map g xs) -- ここで(map g xs)のパターンマッチができない
695デフォルトの名無しさん
2021/01/27(水) 12:36:29.90ID:UiZI3fhW >>694
ありがとうございます
しかしどうもパターンマッチに失敗してるようではないようです
実際コンパイラは型推論に成功してるように見えますし、明示的に
comb7 :: [[ Int ]]
を入れてもダメです
実行時のエラーメッセージも
Non-exhaustive patterns
ではなく
prog : << loop >>
が表示されています
ありがとうございます
しかしどうもパターンマッチに失敗してるようではないようです
実際コンパイラは型推論に成功してるように見えますし、明示的に
comb7 :: [[ Int ]]
を入れてもダメです
実行時のエラーメッセージも
Non-exhaustive patterns
ではなく
prog : << loop >>
が表示されています
696デフォルトの名無しさん
2021/01/27(水) 13:52:31.92ID:fGEABlaN こういう時は自分の考えに自信を持つことも必要
誰かがエラーメッセージを見ている(または見ていない)のを見たからといって簡単に考えを変えない方がいい
誰かがエラーメッセージを見ている(または見ていない)のを見たからといって簡単に考えを変えない方がいい
697デフォルトの名無しさん
2021/02/02(火) 01:48:19.32ID:yyMOWUoH fixの定義は fix f = let x = f x in x となっていますが、
この x 自体は再帰的に定義されていると言えますか?
この x 自体は再帰的に定義されていると言えますか?
698デフォルトの名無しさん
2021/02/02(火) 16:19:31.38ID:ErrealWs >>693
xs0 = repeat 1
xs1 = zipWith (+) xs0 (0:xs1)
xs2 = zipWith (+) xs1 (0:xs2)
xs3 = zipWith (+) xs2 (0:xs3)
こんな感じに個別に定義すれば確かに計算できるので、
comb7 !! 1 を計算するのにcomb7 !! 1 が必要だぞという点を
怒っているような気がするのだが確かなことは言えない、すまぬ
comb6 !! n は計算するのに comb !! (n-1) の情報だけで十分なところが違うので
xs0 = repeat 1
xs1 = zipWith (+) xs0 (0:xs1)
xs2 = zipWith (+) xs1 (0:xs2)
xs3 = zipWith (+) xs2 (0:xs3)
こんな感じに個別に定義すれば確かに計算できるので、
comb7 !! 1 を計算するのにcomb7 !! 1 が必要だぞという点を
怒っているような気がするのだが確かなことは言えない、すまぬ
comb6 !! n は計算するのに comb !! (n-1) の情報だけで十分なところが違うので
699デフォルトの名無しさん
2021/02/02(火) 17:58:42.89ID:AZLuBdJH700デフォルトの名無しさん
2021/02/02(火) 22:40:39.64ID:LQ6cge6d >>698
ありがとうございます
私も多分それが原因かなと思い始めてます
一回目のcomb7 !! 1 と二回目では続く添字が! !!2 から !!1 に減ってるのですがHaskellはそんな事は勘案せずに「comb7 !! 1の展開の中にcomb7 !! 1が出てきたからアウト」と言ってるのかなと
つまりはこの手の二重漸化式はHaskellはそのままズバリでは読んでくれないんでしょうね
ありがとうございます
私も多分それが原因かなと思い始めてます
一回目のcomb7 !! 1 と二回目では続く添字が! !!2 から !!1 に減ってるのですがHaskellはそんな事は勘案せずに「comb7 !! 1の展開の中にcomb7 !! 1が出てきたからアウト」と言ってるのかなと
つまりはこの手の二重漸化式はHaskellはそのままズバリでは読んでくれないんでしょうね
701デフォルトの名無しさん
2021/02/03(水) 00:23:45.54ID:QKvl77B6 comb7 !! 1 を計算するには length comb7 >= 2 のようなものが必要だぞ
でも長さは1かもしれないからアウトという判断は正しい
オーバーランするよりよっぽどいい
でも長さは1かもしれないからアウトという判断は正しい
オーバーランするよりよっぽどいい
702デフォルトの名無しさん
2021/02/03(水) 14:08:13.61ID:mxabq2OH 求めてないかもですがこんなふうならかけますね。
module Main where
import qualified Data.Array.Unboxed as AU
main = do
print $ comb6 !! 2000 !! 1000
print $ comb7_1 !! 1000 !! 1000
print $ comb7_2 1000 1000 AU.! ( 1000, 1000 )
comb6 = ((1 : (repeat 0)) :) $ zipWith (zipWith (+)) comb6 (map (0 :) comb6)
comb7_1 = (repeat 1 :) $ ([ 1 .. ] :)
$ (map (\x -> scanl (+) 1 $ tail x) $ tail comb7_1)
comb7_2 :: Int -> Int -> AU.Array ( Int, Int ) Integer
comb7_2 ly lx = comb7_2_table
where
comb7_2_table = AU.array ( ( 0, 0 ), ( ly, lx ) ) $ concatMap(\i -> map (f i) [ 0 .. lx ]) [ 0 .. ly ]
f 0 x = ( ( 0, x ), 1 )
f y 0 = ( ( y, 0 ), 1 )
f y x = ( ( y, x ) , comb7_2_table AU.! ( (y - 1), x ) + comb7_2_table AU.! ( y, (x - 1) ))
module Main where
import qualified Data.Array.Unboxed as AU
main = do
print $ comb6 !! 2000 !! 1000
print $ comb7_1 !! 1000 !! 1000
print $ comb7_2 1000 1000 AU.! ( 1000, 1000 )
comb6 = ((1 : (repeat 0)) :) $ zipWith (zipWith (+)) comb6 (map (0 :) comb6)
comb7_1 = (repeat 1 :) $ ([ 1 .. ] :)
$ (map (\x -> scanl (+) 1 $ tail x) $ tail comb7_1)
comb7_2 :: Int -> Int -> AU.Array ( Int, Int ) Integer
comb7_2 ly lx = comb7_2_table
where
comb7_2_table = AU.array ( ( 0, 0 ), ( ly, lx ) ) $ concatMap(\i -> map (f i) [ 0 .. lx ]) [ 0 .. ly ]
f 0 x = ( ( 0, x ), 1 )
f y 0 = ( ( y, 0 ), 1 )
f y x = ( ( y, x ) , comb7_2_table AU.! ( (y - 1), x ) + comb7_2_table AU.! ( y, (x - 1) ))
703デフォルトの名無しさん
2021/02/04(木) 22:24:53.84ID:w5MK0dgi >>702
ありがとうございます
参考にさせていただきます
そうですね
もう一つ可読性が欲しい感じがします
元々の問題意識としては私は可読性の高いコードが要求されることが多いのです
例えばFibonacci数列であれば
f n = ( f $ n -1 ) + ( f $ n - 2 )
に可読性においてまさるものはないのですが、もちろんこれでは遅くて使い物になりません
なので実用性も多少はなりとも求めるならある程度は可読性を犠牲にせざるを得ないのですが、どういう方法がいいのだろうというのがテーマなのです
でたまたまFibonacciの場合に
f = 0 : 1 : ( zipWith ( + ) f $ tail f )
というのを見つけてコレ中々いいなと、dpで計算してるのに“メモ”をするための不要な手続きを書く必要がなく、Haskellの“call by need”の機能をうまく利用してdp計算させてるところにちょっと唸ったもので
でどれくらいコレでいけるのかなと二重数列をやってみたらうまくいかなくて、どうしたもんかなと
まぁコレはしょうがないのかもしれませんけど
ありがとうございます
参考にさせていただきます
そうですね
もう一つ可読性が欲しい感じがします
元々の問題意識としては私は可読性の高いコードが要求されることが多いのです
例えばFibonacci数列であれば
f n = ( f $ n -1 ) + ( f $ n - 2 )
に可読性においてまさるものはないのですが、もちろんこれでは遅くて使い物になりません
なので実用性も多少はなりとも求めるならある程度は可読性を犠牲にせざるを得ないのですが、どういう方法がいいのだろうというのがテーマなのです
でたまたまFibonacciの場合に
f = 0 : 1 : ( zipWith ( + ) f $ tail f )
というのを見つけてコレ中々いいなと、dpで計算してるのに“メモ”をするための不要な手続きを書く必要がなく、Haskellの“call by need”の機能をうまく利用してdp計算させてるところにちょっと唸ったもので
でどれくらいコレでいけるのかなと二重数列をやってみたらうまくいかなくて、どうしたもんかなと
まぁコレはしょうがないのかもしれませんけど
704デフォルトの名無しさん
2021/02/05(金) 00:47:44.85ID:hZ1aOePg >>703
方向性違うかなと思いつつ書いたんですがやっぱり違いましたね。失礼しました。
今更どうでもいいですがちょっと間違えたので訂正だけさせてください。
comb7_1 = (repeat 1 :) $ (map (scanl (+) 1 . tail) $ comb7_1)
方向性違うかなと思いつつ書いたんですがやっぱり違いましたね。失礼しました。
今更どうでもいいですがちょっと間違えたので訂正だけさせてください。
comb7_1 = (repeat 1 :) $ (map (scanl (+) 1 . tail) $ comb7_1)
705デフォルトの名無しさん
2021/02/05(金) 01:12:53.20ID:gzN36RyX 読むという目的
可読性の低いコードを、読むことなく却下するという手段
この目的と手段がすぐ入れかわってしまう現象もまた深刻な問題だ
可読性の低いコードを、読むことなく却下するという手段
この目的と手段がすぐ入れかわってしまう現象もまた深刻な問題だ
706デフォルトの名無しさん
2021/02/05(金) 06:11:52.56ID:5jF91Ui3 速さを求めてnconcみたいなもんだな
707デフォルトの名無しさん
2021/02/05(金) 19:44:21.42ID:DBOaHn9B >>703
その遅くて使い物にならない計算を、
可読性をあまり犠牲にしないで爆速にする方法に、
メモ化(memoization)というテクニックがあります。
(その代わり、当然メモリを使います)
メモ化関数 memoize が用意されていれば、
n 番目のフィボナッチ数を求める関数 fib は
次のように書けます。
-- メモ化
fib :: Int -> Integer
fib = fix (memoize . fib')
-- フィボナッチ計算の本体
fib' :: (Int -> Integer) -> Int -> Integer
fib' f 0 = 0
fib' f 1 = 1
fib' f n = f (n-1) + f (n-2)
メモ化関数を提供するパッケージは色々あります。
また、メモ化の仕組みの基礎や本質を学びたいのなら、
次のごく短いブログ記事がおすすめです。
https://kseo.github.io/posts/2017-01-14-memoization-in-hasekll.html
この記事の最後の fibMemo 関数について、
適当な小さな値に適用させたものを
自分でノートに展開してみるといいです。
その遅くて使い物にならない計算を、
可読性をあまり犠牲にしないで爆速にする方法に、
メモ化(memoization)というテクニックがあります。
(その代わり、当然メモリを使います)
メモ化関数 memoize が用意されていれば、
n 番目のフィボナッチ数を求める関数 fib は
次のように書けます。
-- メモ化
fib :: Int -> Integer
fib = fix (memoize . fib')
-- フィボナッチ計算の本体
fib' :: (Int -> Integer) -> Int -> Integer
fib' f 0 = 0
fib' f 1 = 1
fib' f n = f (n-1) + f (n-2)
メモ化関数を提供するパッケージは色々あります。
また、メモ化の仕組みの基礎や本質を学びたいのなら、
次のごく短いブログ記事がおすすめです。
https://kseo.github.io/posts/2017-01-14-memoization-in-hasekll.html
この記事の最後の fibMemo 関数について、
適当な小さな値に適用させたものを
自分でノートに展開してみるといいです。
708デフォルトの名無しさん
2021/02/05(金) 20:00:27.08ID:DBOaHn9B >>707
すいません。
肝腎の memoize 関数の定義を書き忘れました。
memoize :: (Int -> a) -> (Int -> a)
memoize f = (map f [0 ..] !!)
先に紹介した記事にこれを導く過程や、
より速くより一般化する方法を学びたい人へ向けた
URL紹介が載っています。
すいません。
肝腎の memoize 関数の定義を書き忘れました。
memoize :: (Int -> a) -> (Int -> a)
memoize f = (map f [0 ..] !!)
先に紹介した記事にこれを導く過程や、
より速くより一般化する方法を学びたい人へ向けた
URL紹介が載っています。
709デフォルトの名無しさん
2021/02/06(土) 09:10:00.64ID:8eeMDweD >>707
解説ありがとうございます
やはりメモ化するしかないんだと思います
問題はそれがプログラマが明示的に自分でやらないといけないのか、コンパイラが自分でやってくれるのかの差なんだと思います
Haskellは純粋なcall by nameではなく、call by needのシステムの中にメモ化を備えていてプログラマがメモ化するように書いてなくても勝手にメモ化できるものをメモ化してくれるのがすごいとこだと思うんですけど、例えば>>703の2番目の例で最初見た時「なんでこの定義式でメモ化が効くんだ?」とさっぱりわからなかったのが、実はHaskellのcall by needのシステムをうまく利用してるらしいとわかったのが最初なんです
で二重の漸化式だとうまくいかないなと
もちろん二重の全炊きでも上手くsuffixの取り方を変えたりすると同様の方法でメモ化できるんですけど、それでは結局「Haskellの機能を利用して明示的にメモ化を指定することなく高速化した」事にはなりません
まぁコレはしょうがないんでしょうね
どんな計算も常にメモ化して常に同じ評価式を2度扱う事を防いでたらそんなの逆に使い物になりませんからね
解説ありがとうございます
やはりメモ化するしかないんだと思います
問題はそれがプログラマが明示的に自分でやらないといけないのか、コンパイラが自分でやってくれるのかの差なんだと思います
Haskellは純粋なcall by nameではなく、call by needのシステムの中にメモ化を備えていてプログラマがメモ化するように書いてなくても勝手にメモ化できるものをメモ化してくれるのがすごいとこだと思うんですけど、例えば>>703の2番目の例で最初見た時「なんでこの定義式でメモ化が効くんだ?」とさっぱりわからなかったのが、実はHaskellのcall by needのシステムをうまく利用してるらしいとわかったのが最初なんです
で二重の漸化式だとうまくいかないなと
もちろん二重の全炊きでも上手くsuffixの取り方を変えたりすると同様の方法でメモ化できるんですけど、それでは結局「Haskellの機能を利用して明示的にメモ化を指定することなく高速化した」事にはなりません
まぁコレはしょうがないんでしょうね
どんな計算も常にメモ化して常に同じ評価式を2度扱う事を防いでたらそんなの逆に使い物になりませんからね
710デフォルトの名無しさん
2021/02/06(土) 20:56:07.58ID:tGZHMqQF Haskellが「ヤバそう」って偏見だけで敬遠されてるのかなしい…
同級生にも布教したい
同級生にも布教したい
711デフォルトの名無しさん
2021/02/06(土) 21:00:00.51ID:xuEfQm7n >>710
布教という言葉自体、独善的で押し付けがましく感じられる原因になってると思うよ。
相手がいやがらない程度にhaskellの良さや面白さを伝えてそれでも相手が興味をひかれないなら、それ以上はやめときな。
布教という言葉自体、独善的で押し付けがましく感じられる原因になってると思うよ。
相手がいやがらない程度にhaskellの良さや面白さを伝えてそれでも相手が興味をひかれないなら、それ以上はやめときな。
712デフォルトの名無しさん
2021/02/06(土) 21:12:54.72ID:HlAr7yEc >>709
今回の話の本質ではないので、へーそうなんだ、
程度に聞いてくれればいいのですが、
>>703 の2番目の例とは、
f = 0 : 1 : zipWith (+) f (tail f)
のことでしょうか。
もしそうなら、これはメモ化ではないですよ。
(このテクニックをなんと呼ぶのかは知りませんが)
メモ化というのは簡単にいえば、
関数の同じ引数に対する2度目(以降)の適用に備えて、
その引数に対する1度目の関数の値をその引数とペアにして
どこかにメモしておくことです。
ポイントは、2度目以降に備えることではなく、
引数と関数値のペアをメモしておくことです。
それを踏まえて、>>703 の2番目の例において、
では何が関数で、引数と関数値のペアはどこにメモされているか、
考えてみてください。
ただ、言葉の意味は時代と共に変化していくものなので、
今はこれも広義にメモ化と言うことになっているのでしたら、すいません。
私の方が勉強不足です。
今回の話の本質ではないので、へーそうなんだ、
程度に聞いてくれればいいのですが、
>>703 の2番目の例とは、
f = 0 : 1 : zipWith (+) f (tail f)
のことでしょうか。
もしそうなら、これはメモ化ではないですよ。
(このテクニックをなんと呼ぶのかは知りませんが)
メモ化というのは簡単にいえば、
関数の同じ引数に対する2度目(以降)の適用に備えて、
その引数に対する1度目の関数の値をその引数とペアにして
どこかにメモしておくことです。
ポイントは、2度目以降に備えることではなく、
引数と関数値のペアをメモしておくことです。
それを踏まえて、>>703 の2番目の例において、
では何が関数で、引数と関数値のペアはどこにメモされているか、
考えてみてください。
ただ、言葉の意味は時代と共に変化していくものなので、
今はこれも広義にメモ化と言うことになっているのでしたら、すいません。
私の方が勉強不足です。
713デフォルトの名無しさん
2021/02/07(日) 08:28:27.99ID:kgbg5mk/ >>707の方がzipwith使ったものより読みやすくて遥かにいいな
こっちの書き方の方がもてはやされてほしいわ
こっちの書き方の方がもてはやされてほしいわ
714デフォルトの名無しさん
2021/02/07(日) 10:58:25.84ID:nblMEePQ 久しぶりにHaskell(Servant)触ってみたけど
相変わらず呪文のようなテンプレートマクロとかコンパイル通すためだけの幽霊型とか表に出てきているのね
こういうの後ろに隠した実装がほちい(・ัω・ั)
相変わらず呪文のようなテンプレートマクロとかコンパイル通すためだけの幽霊型とか表に出てきているのね
こういうの後ろに隠した実装がほちい(・ัω・ั)
715デフォルトの名無しさん
2021/02/07(日) 19:10:10.31ID:Ae+USThM >>714
試しに作ってみればいいのでは?
そういう気に入らない幽霊型を
とりあえず1つだけ後ろに隠してみて、
使いやすいか試してみればいいと思う。
良さそうなら、ここや GitHub で提案するとか。
試しに作ってみればいいのでは?
そういう気に入らない幽霊型を
とりあえず1つだけ後ろに隠してみて、
使いやすいか試してみればいいと思う。
良さそうなら、ここや GitHub で提案するとか。
716デフォルトの名無しさん
2021/02/07(日) 21:05:48.19ID:kgbg5mk/ Servant辛いから是非お願いしたい
717デフォルトの名無しさん
2021/02/08(月) 03:22:56.40ID:lr3qr0Kv718デフォルトの名無しさん
2021/02/08(月) 07:06:31.27ID:aZaTrcsy >>717
fix x はxの定義じゃなくてfixの定義では
fix x はxの定義じゃなくてfixの定義では
719デフォルトの名無しさん
2021/02/08(月) 09:04:48.35ID:THE6D9/g >>718
fix定義の中でlet節を使って定義されているxの話です。
fix定義の中でlet節を使って定義されているxの話です。
720デフォルトの名無しさん
2021/02/08(月) 12:31:08.86ID:hFpKnaPX >>707
リスト使ったメモ化の理解にはいいんですけど、その例も実は遅いんですよね。!!がO(n)なので。
module Main where
import Data.Function
import qualified Data.Vector as V
main = do
let memo = fibMyMemo 50000
print $memo 50000
print $fibMemo 50000
fibMyMemo l = fib
where
fib = ((V.map f $ V.enumFromN 0 (l + 1)) V.!)
f 0 = 0 :: Integer
f 1 = 1
f n = fib (n -1) + fib (n -2)
memoize f = (map f [0 ..] !!)
fib f 0 = 0
fib f 1 = 1
fib f n = f (n - 1) + f (n - 2)
fibMemo = fix (memoize . fib)
リスト使ったメモ化の理解にはいいんですけど、その例も実は遅いんですよね。!!がO(n)なので。
module Main where
import Data.Function
import qualified Data.Vector as V
main = do
let memo = fibMyMemo 50000
print $memo 50000
print $fibMemo 50000
fibMyMemo l = fib
where
fib = ((V.map f $ V.enumFromN 0 (l + 1)) V.!)
f 0 = 0 :: Integer
f 1 = 1
f n = fib (n -1) + fib (n -2)
memoize f = (map f [0 ..] !!)
fib f 0 = 0
fib f 1 = 1
fib f n = f (n - 1) + f (n - 2)
fibMemo = fix (memoize . fib)
721デフォルトの名無しさん
2021/02/08(月) 18:33:31.66ID:USGkiU7i >>717
マジョリティとマイノリティの違いとか、合法とグレーの違いのようなものだと思えばいいだろ
再帰的な関数と再帰的な型はよく知られている
一方、関数でも型でもないケースは未知のウイルスのようなもので
既存のものと同じだとすぐ決めつけるのは判断が早過ぎる極論
マジョリティとマイノリティの違いとか、合法とグレーの違いのようなものだと思えばいいだろ
再帰的な関数と再帰的な型はよく知られている
一方、関数でも型でもないケースは未知のウイルスのようなもので
既存のものと同じだとすぐ決めつけるのは判断が早過ぎる極論
722デフォルトの名無しさん
2021/02/08(月) 20:09:46.17ID:xtdfQPSv723デフォルトの名無しさん
2021/02/10(水) 06:55:43.73ID:w+SbAYAx >>721
すいません、結局のところ、どういう事でしょう?
すいません、結局のところ、どういう事でしょう?
724デフォルトの名無しさん
2021/02/10(水) 10:35:38.44ID:tXb64EJq 法律や善悪の判断の正しさを疑うのと同じレベルの懐疑的な思考が
数学やデバッグにも必要ということかな
数学やデバッグにも必要ということかな
725デフォルトの名無しさん
2021/02/10(水) 11:17:11.88ID:tXb64EJq 静的型は最強とかガベコレは最強とかいう考えが
疑われるようになったのは半分ぐらいHaskellが原因だよね
疑われるようになったのは半分ぐらいHaskellが原因だよね
726デフォルトの名無しさん
2021/02/10(水) 13:30:33.82ID:em7GM66H >>721←こいつまだいたのか
気持ち悪すぎる
気持ち悪すぎる
727デフォルトの名無しさん
2021/02/10(水) 14:18:45.17ID:tXb64EJq ここは無料だしこんなもんだろ
良いものはみんな課金される
良いものはみんな課金される
728デフォルトの名無しさん
2021/02/11(木) 14:43:11.06ID:/UgD5Hp7 地獄の沙汰も金次第
だが天国への言及はない
だが天国への言及はない
729デフォルトの名無しさん
2021/02/11(木) 16:56:32.70ID:zBw+qxbZ ねえ、購入厨
ひょっとしてHaskellは、きみが同じ地獄を繰り返す毎に
強力なフリーソフトになっていったんじゃないのかい
ひょっとしてHaskellは、きみが同じ地獄を繰り返す毎に
強力なフリーソフトになっていったんじゃないのかい
730デフォルトの名無しさん
2021/02/13(土) 21:17:16.21ID:kqsb0S1y 悪役キャラには著作権等のコンプライアンスを意識させると邪気が抜けてしまう
豆知識
豆知識
731デフォルトの名無しさん
2021/02/14(日) 18:40:01.75 なぜ Haskell スレはワードサラダ bot に狙われてしまうのか
732デフォルトの名無しさん
2021/02/14(日) 20:59:33.34ID:2j5v2BhK733デフォルトの名無しさん
2021/02/14(日) 21:27:29.30ID:A1oxlP1a 731はワードサラダなレスうぜぇなぁくらいの意味しかなくワードサラダなレスが存在してしまう理由を実際に疑問に思っているわけではないという簡単なことが何故わからないのか
734デフォルトの名無しさん
2021/02/14(日) 21:49:22.17ID:2j5v2BhK 731は、うぜぇなぁ以外何も考えてなかったというのか
それは差別意識しかない絶対悪じゃないか
それは差別意識しかない絶対悪じゃないか
735デフォルトの名無しさん
2021/02/15(月) 01:08:13.78ID:Qrz9kKC+ もっと危機感を持ったほうがいいよ
母国語の特徴までネチネチいじられたら外国語はこわくて使えないだろう
英語ができないとプログラミングもできない
母国語の特徴までネチネチいじられたら外国語はこわくて使えないだろう
英語ができないとプログラミングもできない
736デフォルトの名無しさん
2021/02/15(月) 17:23:26.09ID:Mv5LolEs なんかこのスレ会話が噛み合わないよな
>>732←こいつとか明らかに頭おかしいし
こういう人外化け物がうじゃうじゃいるから「特技はコミュニケーション能力です」みたいなゴミ文系が社会で調子に乗り始めるんだろうな
>>732←こいつとか明らかに頭おかしいし
こういう人外化け物がうじゃうじゃいるから「特技はコミュニケーション能力です」みたいなゴミ文系が社会で調子に乗り始めるんだろうな
737デフォルトの名無しさん
2021/02/15(月) 18:24:29.13ID:Qrz9kKC+ コミュ力の悪用を止める方法で一番使えそうなのは制限時間を無くすことだ
5秒で答えさせるような問題でも時間のルールを無視してしまえば
そのゴミ文系ってやつの能力を擬似的にコピーできる
5秒で答えさせるような問題でも時間のルールを無視してしまえば
そのゴミ文系ってやつの能力を擬似的にコピーできる
738デフォルトの名無しさん
2021/02/15(月) 19:02:15.47ID:3zpQr6lX Haskellの話は?
739デフォルトの名無しさん
2021/02/15(月) 20:58:35.44ID:Qrz9kKC+ 最小不動点を定義する半順序の定義がない
それと「再帰」の定義がない
それと「再帰」の定義がない
740デフォルトの名無しさん
2021/02/16(火) 10:45:42.61ID:AZNZAZhP■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか… [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国国営メディア「沖縄は日本ではない」…★7 [BFU★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 高市早苗、岸田政権(当時)に「台湾有事は日本の有事か」という質問をしていた [175344491]
- ケンタッキーの○○○バーガーという予告がアレを想起すると話題に [523957489]
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- んなっしょい🍬禁止🈲のお🏡
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
