1 名前:デフォルトの名無しさん [2020/02/10(月) 18:17:36 ID:L6eYQqyh.net] 関数型プログラミング言語 Haskell について語るスレです。 Haskell Language(公式サイト) https://www.haskell.org/ 日本Haskellユーザーグループ - Haskell-jp https://haskell.jp/ 前スレ 関数型プログラミング言語Haskell Part32 https://mevius.5ch.net/test/read.cgi/tech/1548720347/
325 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 01:20:32 ID:nxDhOjOb.net] >>317 理解できました。 ありがとうございました。
326 名前:デフォルトの名無しさん mailto:sage [2020/05/22(金) 10:43:13.79 ID:9QfQmUEB.net] https://wiki.haskell.org/Pronunciation >Below are some notes for beginners on how to pronounce those strange Haskell operators and 'read' Haskell programs. >>318 https://mevius.5ch.net/test/read.cgi/tech/1548720347/925-
327 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 00:35:45.46 ID:PUmkxvlF.net] 次のように、一つのモナドを遅延的に無限に評価できる関数 repM は定義できるでしょうか? repM :: (Monad) => m a -> m [a] xs <- repM (return 1) print $ take 3 xs -- [1, 1, 1] ys <- take 2 <$> repM (return 1) print ys -- [1, 1]
328 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 01:33:43 ID:m+h1wlWJ.net] >>324 コレは? repMsub x = return(repeat x) repM x = x>>=repMsub main = do xs<-repM (return 1) print $ take 3 xs
329 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 01:44:01.25 ID:m+h1wlWJ.net] あ、コッチの方がかっこいいのか? でも可読性を犠牲にしだすとperlみたいになるから良くない? repM = (>>=(return.repeat))
330 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 01:56:13 ID:PUmkxvlF.net] >>325 >>326 それはひとつのモナドを3回評価しているのではなく、 ひとつのモナドの中の値を3回評価しているのではないでしょうか? 例えば repM (getLine >>= print) を評価すると、 1回しか getLine >>= print を評価しません。 ちなみに、IOモナドに限れば unsafeInterleaveIO 関数が使えます。 また、リストではなくいわゆるストリームなら出来ました。 ですが今はモナド全般に適用でき、リストのモナドを返す関数を求めています。
331 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 02:01:15 ID:PUmkxvlF.net] >>325 すいません。 補足です。 a <- take 3 <$> repM (getLine >>= print) を評価すれば、 3回の副作用 getLine >>= print が実行され、 a は [(), (), ()] を束縛していて欲しいのです。
332 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 12:08:02 ID:eKnPDQS2.net] module Main where import Control.Monad.IO.Class (MonadIO, liftIO) import Control.Monad.Trans (lift) import Data.Conduit (ConduitT, runConduit, yield, (.|)) import qualified Data.Conduit.List as CL repIO :: (Monad m, MonadIO m) => IO () -> ConduitT () () m () repIO io = do x <- liftIO io yield x >> repIO io repM :: Monad m => m o -> ConduitT i o m r repM m = do x <- lift m yield x >> repM m main :: IO () main = do x1 <- runConduit $ repIO (getLine >>= print) .| CL.take 3 print x1 -- [(),(),()] x2 <- runConduit $ repM (getLine >>= print) .| CL.take 3 print x2 -- [(),(),()] let x3 = runConduit $ repM [1,2] .| CL.take 3 print x3 -- [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]] let x4 = runConduit $ repM [] .| CL.take 3 print (x4 :: [[Int]]) -- [] let x5 = runConduit $ repM (J
333 名前:ust 1) .| CL.take 3 print x5 -- Just [1,1,1] let x6 = runConduit $ repM Nothing .| CL.take 3 print (x6 :: Maybe [Int]) -- Nothing [] [ここ壊れてます]
334 名前:デフォルトの名無しさん mailto:sage [2020/05/23(土) 13:15:18.54 ID:eKnPDQS2.net] あ、ストリームでできたってこういうことか
335 名前:デフォルトの名無しさん mailto:sage [2020/05/24(日) 19:39:02 ID:A0PpU4F1.net] HaskellのフレームワークってGHC拡張たくさん使われてるから、基本的な文法だけ知ってても、エラーが出たら意味分からなくなるという初心者泣かせな言語だな。地道にコツコツ知らないことを勉強してってるわ。 使いこなしてる人ホンマ羨ましい。
336 名前:デフォルトの名無しさん mailto:sage [2020/05/24(日) 22:41:15 ID:oexHBYog.net] The state of GHC on ARM https://www.haskell.org/ghc/blog/20200515-ghc-on-arm.html
337 名前:デフォルトの名無しさん [2020/05/25(月) 14:19:28 ID:HRWjfAZ+.net] >>331 そういう悪い所を悪いと言えないのが初心者で 初心者の甘い評価がなければ持続不可能なのがGHCじゃないか
338 名前:デフォルトの名無しさん mailto:sage [2020/05/25(月) 19:07:59 ID:b4izxg0D.net] むしろ俺は段階的に学べていいと思ったが
339 名前:デフォルトの名無しさん mailto:sage [2020/05/26(火) 13:27:47.52 ID:w7oGlmub.net] haskellのフレームワークとやらが具体的に何を指しているのか分からん。 YesodやServantなどのWebフレームワークしか思いつかんが。 いずれにしても、そもそも初心者がフレームワークに頼るべきではない。 初心者を抜けて、さぁ本格的なアプリでも作ってみるかとなった時に使えばいい。 初心者は15パズルやTODOツールみたいな簡単なアプリをフルスクラッチで作ってみて、 言語拡張の必要性や、有用なライブラリの使い方を少しずつ学ぶことを奨める。
340 名前:デフォルトの名無しさん mailto:sage [2020/05/27(水) 11:14:49 ID:xJStjlCD.net] そういうのはつまらんのだよ
341 名前:デフォルトの名無しさん mailto:sage [2020/05/27(水) 13:16:13 ID:SIsgBJ88.net] >>336 初心者が面白いと思える学べる題材ってなんかあるかな? C#だとゲームとかGUIとか簡単なのになぁ Pythonだって色々思い浮かぶのに
342 名前:デフォルトの名無しさん mailto:sage [2020/05/27(水) 17:32:08 ID:Ro2X8Fae.net] プロジェクトオイラーでもやったら
343 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 00:14:38.34 ID:Hx2r4buk.net] haskell興味あるのですがhaskellの長所と短所ってなんですかる
344 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 00:57:51.48 .net] 若さと情熱に身を任せたいなら C、衰えても続けたいなら Haskell
345 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 07:22:48 ID:mJaFRwIH.net] GoとRustが無かった時代には長所がいっぱいあったんだろう もし、その時代のコードを変更することなく今使えるならそれも長所だが
346 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 07:54:35.82 ID:7l9AMad4.net] >>339 長所は難しいことをより難しく書けること 短所は簡単なことでも難しく書かざるを得ないこと 本質的に純粋関数だけじゃリリースできないことも大問題ではある 切り分けで対処しても破壊を含むコードは必ず走る 理想が現実に敗北したような体系だから手を出さないほうがいいよ
347 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 08:30:23.80 ID:wwuYcwOw.net] >>339 長所は、宣言的に分かりやすく書いたプログラムが意図通りにちゃんと動くことです。 何をするのかと、どのようにするのか、この二者をきっちり分けてプログラムできるのがHaskellの大きな魅力です。 (できると言っても、初心者が簡単にできることではありません。 その方向に正しく精進する必要があります。) 短所は、少し上のレスでも言及されていますが、入門を抜けた後に何に取り組めば良いのか分からなくなることです。 始めから何か目的があってHaskellを学び始めたのでしたら良いのですが、そうでなければ、 魅力的な題材の無さに愕然とし、路頭に迷うことになるでしょう。 実はgithub等を漁れば先輩方の様々はジャンルの非常に参考になるプログラムを数多く拝見でき、 自分も取り組んでみたくなる題材がたくさん見つかるのですが、逆に言えばそうやって努力して探さないと見つかりません。
348 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 09:57:17 ID:zRWEM9Qa.net] >>342 後半、そういう批判よくあるけど毎回何言ってんのかよくわからん お前達は何を批判してるの?
349 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 10:24:25.66 ID:mJaFRwIH.net] 過激派と思ってた奴に中道の仕事を奪われる 理論的にありえないと思っていた中道と中道の対立が現実になる
350 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 11:22:41 ID:xO3kN7Ry.net] どんなに多くの短所があろうが それらに勝る長所が一つあれば好きになる 人でもプログラミング言語でも
351 名前:デフォルトの名無しさん [2020/05/29(金) 11:35:07 ID:OBuVVMWP.net] >>339 Haskellに対して懐疑的だった初学者がParsec使ってパーサー書いてみた感じだと 長所 バグ皆無のパーサーをBNFを書き写すように簡潔に書ける (自分はCやrubyでは書けなかった) 問題に応じて言語内言語を作れるので、コードの量を極めて少なくできる 短所 yaccやbisonより学ぶのにかなり時間がかかりそう 言語内言語を作れてしまうので、ぱっと見ただけではコードを理解できない (数式を理解するには記号の意味を理解している必要があるのと同じ) yaccやbisonを使った経験は無い だが、Haskellの方が応用が利き問題の解決の仕方が美しいので学びたいとは思わなくなった 解決したい具体的な問題があり、自分が学んできた言語だとコードが大きく複雑になりそうで、新しい概念を学ぶ余裕と覚悟があるなら良いと思う ただ便利そうなのを探してるとか興味があるってだけだと挫折するかも Haskellを参考にしたより新しい言語を学ぶ方がスマートかもしれない 自分みたいにHaskellに懐疑的で徹底的に学んで悪口書いてやろうと思っているならマジお勧めwww
352 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 19:36:21.64 ID:/U1uledC.net] >>339 長所: 多くのバグをコンパイル時に潰せる 短所: 手続き型プログラミングにおける既知の資産(アルゴリズムなど)が活用しにくい
353 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 05:07:50.77 ID:seoK/8uJ.net] Ocamlを使わないといけなくなっていじり始めたけど、あれもこれも出来なくて不便だな やたら冗長になるし…
354 名前:デフォルトの名無しさん [2020/06/01(月) 07:39:57.03 ID:L1Mt0gVE.net] 書くのが不便になる代わりに、ぱっと見ただけで理解できるコードになる という軍師の言葉をぱっと見ただけで信じる者だけがOCamlを使いなさい
355 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 08:15:03 ID:dkkr+KCk.net] >>349 できないことの例を教えてください
356 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 01:46:24.39 ID:UWOmEsh4.net] >>329 >>330 やはり純粋なリストだけでは望む仕組みは作れないという結論に達しました。 逆に言えば、そういう事が容易にできるのがストリームの利点の一つなのだと理解しました。 ありがとうございました。
357 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 23:44:13.56 ID:aqmhehrv.net] memptyってなんでmunitやmidとかじゃないんだろうな? emptyの心がよーわからん 文字列のように意味的に空なモノイドもあるが、 空じゃない例の方が圧倒的に多く一般的じゃないか? ま、どうでもいいんだけどな
358 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 08:31:53.87 .net] let nop = mempty in ...ってやってる(嘘)
359 名前:デフォルトの名無しさん mailto:sage [2020/06/10(水) 18:32:52.39 ID:vPvQB3B1.net] top level の型の指定についての質問です。 haskellのルールでtop levelでないところでは曖昧な型で型推論してくれて通るけど、top levelでは一意に型が決まらないとダメとかなんとかそういうルールがあって、 それでハマって苦労した記憶があるんですが、今その事ふっと思い出したんですが、詳しい内容が思い出せません。 haskell ambiguous top level とかでグクってもそれらしい話しが出てこないんですけど、なんか思い当たる方おられませんか?
360 名前:デフォルトの名無しさん mailto:sage [2020/06/11(木) 20:57:26 ID:h7Wncfkb.net] >>355 どういうことか、何か例を挙げることはできますか?
361 名前:デフォルトの名無しさん mailto:sage [2020/06/11(木) 23:57:59 ID:oU50Re4d.net] >>356 レスありがとうございます。 当時なんかのプログラム組んでてハマったんですが、どんな例だったかは思い出せません。 しかし制限の名前はわかりました。 monomorphic restriction (単相性制限) という奴でした。 ググってみると多相性を無制限に認めてしまうとメモ化の実装が難しくなるようで性能に影響してしまう事を避けるための制限のようです。 こまめに型宣言書くようにするか、性能を犠牲にしてもよいなら制限をなくすオプションとかもghcとかには用意されてるので実害は無いんですけど、昔ハマって原因突き止めるのにエライ苦労したのでなんだったかふっと気になってお聞きしました。 お騒がせしました。
362 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 03:07:06 ID:YpUxhodA.net] >>357 いえ、お気になさらず。 こちらも勉強になりました。
363 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 10:17:27.94 ID:6v+H5Lhm.net] 今、最新のghcでdependent typesは使えますか?
364 名前:デフォルトの名無しさん mailto:sage [2020/06/23(火) 00:33:49.50 ID:2ZCsz0wY.net] 次の2つの関数の型の違いを説明していただけないでしょうか。 f :: C a => T a -> b -> b g :: T a -> (C a => b) -> b 関数gのようなconstraintの使い方にはこのような効果や意味がある、 とはっきり説明できず、モヤモヤしています。 また、このようなconstraintの使い方には特別な用語があるのでしょうか。 webで検索して調べてはいますが、適切なキーワードが思いつかず、苦労しています。
365 名前:デフォルトの名無しさん mailto:sage [2020/06/27(土) 16:04:56.51 ID:FJC3hMrg.net] Haskell用語だけでは説明できない気がする C++用語で a -> bのaとbはtemplateを実体化する引数 C a => bはtemplateの宣言であって実体化ではないのでgは意味がわからない
366 名前:デフォルトの名無しさん mailto:sage [2020/06/28(日) 01:53:39.90 .net] Steamで買えるHaskell製ゲームを教えて
367 名前:デフォルトの名無しさん mailto:sage [2020/06/28(日) 10:31:17 ID:hu4PmWPn.net] >>361 レスありがとうございます。 すいません、C++に精通していないため、templateの実体化や宣言の意味がよく分かりません。 件の関数型は次のブログにありました。 Introduction to Singletons (Part 1) https://blog.jle.im/entry/introduction-to-singletons-1.html#going-backwards ここの Going backwards の節です。 (昔、別のWebページでも見て、その時も不思議に思っていたのですが、どこのページだったか忘れてしまいました) そこでは withSingDSI :: SingDS s -> (SingDSI s => r) -> r という型です。 確かに SingDSI s => のconstraintを外すと、この関数を呼び出すところで型エラーとなってコンパイルできません。 代わりに、型シグネチャの先頭に SingDSI s => を書いたとしても、です。 しかし、なぜ型が合わないのか理由が分かりません。 何かしらの意味があるはずなのですが・・・
368 名前:デフォルトの名無しさん mailto:sage [2020/06/29(月) 23:47:59.12 ID:MeiET0BU.net] >>363 のリンク先の話は中々勉強になるなぁ。 自分でこんなの使いこなせるようになるとは思えないけど。
369 名前:デフォルトの名無しさん mailto:sage [2020/07/02(木) 23:40:38 ID:Rg/xVuvf.net] >>360 Haskell勉強中で答えられるほどの知識無いけど constraintの意味から察するに、右の引数の型が正格評価されていないうちには受け入れないということでは 遅延的に型を選択して返すような関数は作れるけど、それを明示せずに正格評価の関数に渡せてしまうと追跡困難になる 引数の型を決定しておかないと渡せないようになってるんじゃないかな つまり、前者は第一引数の型を指定してて、後者は第二引数の型を指定しているというだけだと思う 知らんけど
370 名前:デフォルトの名無しさん [2020/07/04(土) 23:44:16 ID:LjgILXlp.net] すごいブログを見てしまった後では気が引けるが、前に書いた随伴をhtmlにした [デフォルトの名無しさん](https://pastebin.com/WTvqXjnT) なんか動いているな、程度の確認しかしていないのでバギーだと思う サイズが大きいけどほとんどがcss パット見、jsは、require, jquery, mathjaxぐらい 実行環境はihaskell
371 名前:デフォルトの名無しさん mailto:sage [2020/07/27(月) 22:40:30.17 ID:XpS4ozgV.net] 遅延評価のありがたみよくわからんかったけど なんとなく分かった 使うか使わない情報、ひとまとめに定義したいんだけど 使わないのなら、情報取りに行くだけ無駄 でも、遅延評価なら、無駄と思える情報も定義できる なぜなら、使って初めて情報を取りに行くのだから なるほどね と思った
372 名前:デフォルトの名無しさん mailto:sage [2020/07/27(月) 22:51:22.29 ID:u9oz0ryS.net] 有名人だらけで楽しみですな。 https://haskell.love/
373 名前:デフォルトの名無しさん [2020/08/13(木) 17:57:45.06 ID:AeuuY+wz.net] 圏論入門 Haskellで計算する具体例から 雪田修一 (単行本) という本が近々出るので、Haskellの予習のためにHaskellの本を買いました。 プログラミング環境は何をインストールするのがおすすめでしょうか? OSはWindows 10を使っています。
374 名前:デフォルトの名無しさん [2020/08/13(木) 18:55:01.02 ID:AeuuY+wz.net] Haskell Platformというのがいいみたいですね。 でもダウンロードしようとしたら、まず、Chocolateyとかいうのをインストールしなくちゃいけないんですね。 大丈夫ですか?これ?
375 名前:デフォルトの名無しさん mailto:sage [2020/08/13(木) 21:17:46.02 .net] Windows Subsystem for Linux 2 (WSL for short)を有効化してWSL用ディストリビューション(Ubuntu 20.04 LTSなど)をWindows ストアからインストールすることで、Windows内で仮想的にリナックスを使ってそこでHaskellを始めるのが良いです
376 名前:デフォルトの名無しさん [2020/08/13(木) 21:24:06.64 ID:AeuuY+wz.net] Windowsと比較してリナックスの利点は何でしょうか? 大きなアドバンテージはありますか?
377 名前:デフォルトの名無しさん mailto:sage [2020/08/14(金) 06:03:07.79 ID:OycuixUd.net] >>370 今のHaskell Platformのインストールってそういう感じになってるんだな Chocolatey自体はWindowsでそこそこよく使われているパッケージマネージャなので一応信頼してよい
378 名前:デフォルトの名無しさん [2020/08/14(金) 08:46:51 ID:XgOd4/dA.net] >>371 Windowsにそのままインストールしちゃいました。 Windows PowerShellから起動する以外の使い方はないでしょうか? GHCiというのもグラフィカルユーザーインターフェースのソフトはないのでしょうか?
379 名前:デフォルトの名無しさん [2020/08/14(金) 12:57:45.74 ID:XgOd4/dA.net] リストとタプルについてなんですが、Pythonでのリストとタプルとは違いがあるようです: let a = [1,2,3] drop 1 a としてもa == [2,3]とはなりません。 let b = (1,2,3) drop 1 b とするとエラーになります。 Pythonの場合は、a = [1,2,3]に要素を追加できましたが、b = (1,2,3)にはタプルがイミュータブルであるため追加できませんでした。 ですが、b[1:]とすれば、(2,3)というタプルが得られたと思います。 どう考えればいいのでしょうか?
380 名前:デフォルトの名無しさん mailto:sage [2020/08/14(金) 17:17:33.31 ID:58KQIAkg.net] >>375 副作用のあるコードの書き方を見せるのは簡単だけど、関数型が初めてなら まずはHaskellのチュートリアルを読んで関数型の考え方を出来るようになったほうがいい
381 名前:デフォルトの名無しさん mailto:sage [2020/08/14(金) 17:46:17.87 ID:XgOd4/dA.net] >>376 ありがとうございます。 「すごいHaskellたのしく学ぼう!」という本の第1章を読み終わりました。この本を読んでいこうと思います。
382 名前:デフォルトの名無しさん mailto:sage [2020/08/14(金) 20:54:14.09 .net] なぜエラーになるかといえば、タプルにdropはないからです リストは『全て同じ型』の要素の片方向リストです。要素数は可変です。C++のforward_listをイメージしてください タプルは『それぞれ好きな型の組み合わせ』であり、リストではありません。要素数は固定です 両者は本質的に内部実装が異なります。リストは要素と、次に辿る先の情報を組にしたデータ構造、一方でタプルはその数だけデータを納めるのみのデータ構造です 抽象的には、リストは2要素のタプルであり、一項目に要素、二項目は(再帰的に)リストを保有します。 こうすることで、二項目を見れば(リストなので)『要素と、二項目にまたリスト』が格納されています そのリストの二項目を見れば・・・となって単方向リストが実装できている事が理解できます タプル(,)は二項関数であるとみなせます。コンマの左側と右側に一つずつ何かを取って入れる関数です。 リストでは実際は『:』という二項関数が二項タプルと同じ役目を果たします。つまり 要素 : リスト のように書き (要素, リスト) と抽象的に同じであると気づくことができます。
383 名前:デフォルトの名無しさん [2020/08/14(金) 21:56:07.86 ID:19vTStSCU] 【A型の人ごめん】「まじめ人間」は、自分の人生を生きられず、しかもお金持ちになれない。 https://www.youtube.com/watch?v=ZBSMJHK_b34 【人生観変わる話】「サラリーマン脳」のヤバい特徴5選。 https://www.youtube.com/watch?v=mPCOn0qhW6M 【人生終了】情弱がハマる「貧困スパイラル」のリアル。 https://www.youtube.com/watch?v=T3R71zjbolc バカでもわかる!ネットビジネスの始め方。 https://www.youtube.com/watch?v=LGM9VxlfDeo&t=147s 時給労働から卒業しよう!貧乏人が知らない「お金の稼ぎ方」まとめ。 https://www.youtube.com/watch?v=aibytYID1yY 【人生攻略】経験・実績ゼロのあなたが、最短で何者かになる方法。 https://www.youtube.com/watch?v=258RdS9Brxk 空気を読んで生きてる「まじめ人間」は成功しないよ。 https://www.youtube.com/watch?v=F2dwIOnNdGA&t=51s 【残酷】貧乏人はいつも忙しいのに、お金持ちは暇である理由。 https://www.youtube.com/watch?v=YkRKSgbyyf8
384 名前:デフォルトの名無しさん mailto:sage [2020/08/14(金) 23:21:17.25 ID:OycuixUd.net] >>375 コンパイルエラーの文章を読んでぐぐる癖をつけよう 覚えはじめの頃に出会うエラーは大抵は文法ミスか型エラーだろうから ぐぐれば「何が悪いか」はだいたい解決する 「なぜ悪いか」はすごいHaskellあたりを読み進めていけば習得できるはず
385 名前:デフォルトの名無しさん mailto:sage [2020/08/15(土) 17:24:00.25 ID:uxgG4TyL.net] >>378-380 ありがとうございました。
386 名前:デフォルトの名無しさん [2020/08/16(日) 18:14:55.92 ID:tHIsB9jz.net] Haskellの本を読んでいると静的型付けだとか出てきます。 単にHaskellの仕様を理解するだけでなくもっと深く、どういう考え方でHaskellというプログラミング言語が設計されたのかにも興味があります。 プログラミング言語論みたいな本でおすすめの本はないでしょうか?
387 名前:デフォルトの名無しさん mailto:sage [2020/08/16(日) 21:18:57.26 ID:EuDMb00g.net] Haskellはある日突然に誕生したわけではなく、 その前身のMirandaとKRCという関数型言語から 多くの特質を受け継いでいます これら言語に関してはW*k*p*d*aで簡潔に解説されてるので、 まずそちらを一読したのちに参考文献に当たるべきでしょう 以下ではW*k*p*d*aで欠けている日本語の文献を紹介します Miranda [1] 第7章 Miranda, p139-163, 新しいプログラミング・パラダイム, 共立出版, 1989年 ttps://www.am*z*n.c*.j*/dp/4320024931 Mirandaに関する包括的な解説 [2] 関数プログラミング, 近代科学社, 1991年 ttps://www.am*z*n.c*.j*/dp/4764901811 Mirandaを用いた関数型プログラミングの入門書 モナドを含む圏論の応用/発展が誕生する以前の時代に書かれた貴重な教科書 KRC [3] 4. 関数型言語 KRC, p36-47, 新世代プログラミング, 共立出版, 1986年 ttps://www.am*z*n.c*.j*/dp/4320022599 [4] 6.2 KRC (Kent Recursive Caluculator), p132-142, プログラミング言語の新潮流, 共立出版, 1988年 ttps://www.am*z*n.c*.j*/dp/4320023773 [3], [4] ともKRCに関する包括的な解説 KRCはすでにインデントベースの構文/純粋関数型/ パターンマッチ/リスト内包表記 といった特質を備えた動的型付け関数型言語でした
388 名前:デフォルトの名無しさん mailto:sage [2020/08/16(日) 21:54:00.05 ID:jqjR96Dg.net] >>382 まず、Types and programming languages とSteve Awodey の Category Theory 読んでからや。 Haskell の話するのは。
389 名前:デフォルトの名無しさん mailto:sage [2020/08/16(日) 22:04:09.80 ID:mrCar2cd.net] Haskellは魔窟の巣窟や 近寄るものは内臓から食い散らかされるデー 初心者はPythonが最適やろ〜
390 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 17:36:03 ID:CFLjXFs2.net] >>383-384 ありがとうございました。 Types and programming languagesというのが比較的新しい本なので、興味を持ちました。
391 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 18:54:59.27 ID:CFLjXFs2.net] クイックソートを行う関数を作ったのですが、エラーが出ます。どこが間違っていますか? quicksort :: (Ord a) => [a] -> [a] quicksort [] = [] quicksort (x:xs) = (quicksort [t | t <- xs, t <= x]) ++ [x] ++ (quicksort [t | t <- xs, x < t])
392 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 19:01:32.08 ID:QJrG17W6.net] >>387 Haskell初心者に限った事柄ではないけれど、 こうした場で質問する者の心構えとして 出てしまったエラーメッセージをコピペする といった、当たり前の行動は身につけるべきだと思うよ
393 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 19:03:19.26 ID:CFLjXFs2.net] >>388 ありがとうございます。 エラーメッセージは以下です。 Prelude> :r [1 of 1] Compiling Main ( baby.hs, interpreted ) baby.hs:153:1: error: parse error (possibly incorrect indentation or mismatched brackets) | 153 | quicksort :: (Ord a) => [a] -> [a] | ^ Failed, no modules loaded.
394 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 19:05:47.77 ID:CFLjXFs2.net] インデントも間違っていないと思いますし、カッコも問題ないと思うのですが。
395 名前:デフォルトの名無しさん mailto:sage [2020/08/17(月) 20:38:28.08 ID:0Q701Csj.net] >>390 >>387 をコピペしたら、俺の環境では動いたよ。 取り急ぎ。
396 名前:デフォルトの名無しさん mailto:sage [2020/08/18(火) 02:46:50.61 ID:rj5JRKyz.net] 153行より前の部分がおかしいんでしょ
397 名前:デフォルトの名無しさん mailto:sage [2020/08/18(火) 10:50:34 ID:QANbTDtx.net] >>391-392 ありがとうございました。 >>392 ご指摘どおりでした。ありがとうございました。
398 名前:デフォルトの名無しさん [2020/08/19(水) 15:58:22.36 ID:FHOhxH/M.net] (1)と(2)で同じ関数だそうです。 add :: Int -> Int -> Int は add :: Int -> (Int -> Int) と等価だそうです。 だとするならば、 (1)のほうが理屈の分かる書き方のように感じます。 (2)はadd' :: Int -> Int -> Intであると宣言しておきながら、その中身の表現を見ると、2つのInt型の引数を受け取ってその和を返す関数にしか見えません。 それにもかかわらず、add' 1は1引数の関数で引数に1を足す関数を表しています。非常に違和感を覚えるのですが、(2)は一体どういうことなのでしょうか? わかりにくいです。 (1) add :: Int -> Int -> Int add n = \x -> x + n (2) add' :: Int -> Int -> Int add' n m = n + m
399 名前:デフォルトの名無しさん [2020/08/19(水) 15:59:38.45 ID:FHOhxH/M.net] 単なる表現方法と割り切ればいいのでしょうか?
400 名前:デフォルトの名無しさん [2020/08/19(水) 16:07:34.77 ID:FHOhxH/M.net] nに対して、「mにn+mを対応させる関数」を対応させる関数の表記法として、 add' n m = n + m を採用するというのが非常に不自然に思います。
401 名前:デフォルトの名無しさん mailto:sage [2020/08/19(水) 16:24:31.96 ID:amUamLwq.net] 入門書のカリー化の箇所を読めばいいんじゃね haskell内での関数は一変数関数として扱えて、 add' n m = (add' n) m というだけ
402 名前:デフォルトの名無しさん [2020/08/19(水) 16:31:52.13 ID:FHOhxH/M.net] >>397 ありがとうございます。 (1)の表記法だけ許してほしいと思うんです。(2)だけみたらまるで2変数関数のように見えますから。
403 名前:デフォルトの名無しさん mailto:sage [2020/08/19(水) 20:35:34.21 ID:1ghAy1sC.net] (今は結合性と優先順位は無視していいので) n + m は (+) n m と同じ意味になる。 つまり(2)は add = (+) に変数を明示して右辺の演算子を中置記法に戻しただけ むしろ変数増やしたのが見にくい原因
404 名前:デフォルトの名無しさん mailto:sage [2020/08/20(木) 07:58:20.18 ID:mQjEXV61.net] >>394 (1) の展開は中途半端で、ちゃんと書くならこう (0) add :: Int -> Int -> Int add = \n -> \m -> n + m これを(1)や(2) のように書いてもよいというのはHaskellの決め事 慣れないうちは常にこう書いていてもよいが 書くのも読むのも段々面倒になってくると思う 慣れればあまり意識せずに読み替えられるので ついでに言うと 真の2変数関数が必要ならタプルを用いてこう書く add'' :: (Int, Int) -> Int add'' (n, m) = n + m これらは確かに厳密には区別しなくてはいけないが、 ゆるく同一視しておくほうが便利なことも多いので Haskellでは(2)のような書き方が許されている、と自分は理解している
405 名前:デフォルトの名無しさん mailto:sage [2020/08/20(木) 08:57:36.69 ID:LuBKaaMH.net] >>399-400 ありがとうございます。 >>400 (0) add :: Int -> Int -> Int add = \n -> \m -> n + m この書き方が本質的で一番わかりやすいですね。 ありがとうございます。
406 名前:デフォルトの名無しさん [2020/08/20(木) 11:51:35 ID:LuBKaaMH.net] 圏論入門 Haskellで計算する具体例から 雪田修一 (単行本) 図書館に購入リクエスト済みです。楽しみです。
407 名前:デフォルトの名無しさん [2020/08/20(木) 14:53:48.13 ID:uVfTx7sc.net] >>1 simulationライブラリで純粋な関数式プログラミングをする ttp://x0000.net 学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net 数学 物理学 化学 生物学 天文学 地理地学 IT 電子 工学 言語学 国語 方言 など VM + ASM を書いた (C#, DX) * x86 ではない! simulationライブラリで純粋な関数式プログラミングをする UIライブラリ (C#, 2D) を作ったよ 連続と離散を統一した! 4Dエンジン matrixのライブラリ ある強力なFor関数 SQLライブラリ VM + ASM のダウンロード ttp://up.x0000.net/files/TSimulang.zip
408 名前:デフォルトの名無しさん [2020/08/21(金) 10:45:55 ID:VIa1N6p8.net] 関数の合成をする関数(.)を以下のように誤って書きました。 (x -> f (g x))はラムダ関数なので(\x -> f (g x))と書かないといけないと思います。 ですが、以下のコードでちゃんと動作しました。なぜでしょうか? (.) :: (b -> c) -> (a -> b) -> a -> c . = \g -> f -> (x -> f (g x))
409 名前:デフォルトの名無しさん [2020/08/21(金) 11:35:07.30 ID:VIa1N6p8.net] あともう一つ質問があります。 「すごいHaskellたのしく学ぼう!」に「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」 と書いてありますが、左結合だったとしても、同様に一度にたくさんの関数を合成できるはずです。 左結合だったとしてもf (g (z x))は(f . g. z) xと等価であることに変わりはないはずです。 これは一体何が言いたいのでしょうか?
410 名前:デフォルトの名無しさん mailto:sage [2020/08/21(金) 18:51:58.39 ID:3Xa4QDEo.net] >>405 左結合だと等価にならないよ
411 名前:デフォルトの名無しさん mailto:sage [2020/08/21(金) 18:53:55 ID:VIa1N6p8.net] (f . g) . z = f . (g . z)だから等価だと思ったんですけど、間違っていますか?
412 名前:デフォルトの名無しさん mailto:sage [2020/08/21(金) 20:51:03.06 ID:3LvfPoDL.net] 通常の関数適用は左結合だから f g z x は ((f g) z) x と同じ意味になって コンパイルエラーになっちゃうけど 関数合成演算子を使うと括弧が減るよ、ということが言いたいはず 関数合成自体は結合的だからそこの向きは確かに関係ないね
413 名前:デフォルトの名無しさん mailto:sage [2020/08/21(金) 22:34:08.88 ID:nqLClnr+.net] >>405 単純に >f (g (z x))は(f . g. z) xと等価です。 は、数学と同じ優先順位ですよってことじゃない? それ以上の疑問は抱かんかったけど 試してないけど、俺も>>406 に同意 多分整数演算で除算演算の関数を関数合成すれば、いくつか試せば同一にならないのは簡単に見つかるはず 引数をたくさん試すだけでも見つかりそう めんどこっいのでやらないけど
414 名前:デフォルトの名無しさん mailto:sage [2020/08/21(金) 23:19:07.20 ID:nqLClnr+.net] >>407 それってそうなの? 俺は、数学の本好きで読んでるんだけど、そこまで基本的なことは突き詰めてないw 写像の合成が結合則を満たす ものもたくさんありそうだけど、 写像の合成は必ず結合則を満たすものなの?そこから疑問に思った方がいいんじゃない? 数学の本読んでると、右XXと左XXと区別するものが多いんで、普通に満たさないと思ってたw いや、俺が間違ってるかもしれんから、そこから調べてくれると俺もうれしい ちなみに、大学数学レベルなのが 1+1=2 の証明。俺は調べたくないw
415 名前:デフォルトの名無しさん mailto:sage [2020/08/22(土) 00:32:18.31 ID:75MjfSAz.net] >>410 位相空間論の入門書には大抵書いてあるよ あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった ((f . g) . h) x = (f . g) (h x) = f (g (h x)) = f ((g . h) x) = (f . (g . h)) x この等号は計算結果が等しいという意味で 途中の時間・空間計算量の違いは気にしていないので念の為
416 名前:デフォルトの名無しさん mailto:sage [2020/08/22(土) 00:48:03.06 ID:66roH7xF.net] >>410 しらんけど、位相空間って連続写像仮定してないか? プログラミング言語でいう写像とは違う 位相空間論で一般的に言われているのならその定理を示した方がいいんじゃない? 個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。 >あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった こっちはたぶん書籍持ってるかな?ページ数教えてくれる? 四則演算というか群論でいう、逆元を仮定しているとかそんな感じやない?しらんけど 数学ではよくあるけど、仮定が大事 それを無視するから、結論を間違えるのはよくある 貴方が間違えたかどうかは知らんど 写像の合成で結合則が必ず成り立つのなら、そのような記述はどっかの書籍に必ずある 自分は見たこと無い。あるとすれば、なんらかの仮定で限定されている。
417 名前:デフォルトの名無しさん mailto:sage [2020/08/22(土) 01:01:19.51 ID:fPcZe606.net] 知らん過ぎ
418 名前:デフォルトの名無しさん mailto:sage [2020/08/22(土) 01:40:43.87 ID:75MjfSAz.net]
419 名前:rget="_blank" class="reply_link">>>412 > 個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。 位相空間論の〜っていうのは言い方が悪かったかな、「集合と位相」みたいなタイプのやつ 大抵最初の方で一般の集合論をやるのでそういうつもりで言った 仮定が大事というのはその通りで もちろん連続性も全単射も仮定しない一般の写像に対する定理 集合A, B, C, D と写像 f: C->D, g: B->C, h: A->B に対して (f . g) . h = f . (g . h) が成り立つ > >あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった > こっちはたぶん書籍持ってるかな?ページ数教えてくれる? P.30 第1章 練習問題Eの解答 こっちはあまりにも簡素に書いてあるので見ても何の参考にもならないかもだが… ただしHaskellには全域でない関数があるから(headとかtailみたいな例外を返し得るやつね) そういうのが絡むと結合性が怪しいケースはもしかしたらあるかもしれない [] [ここ壊れてます]
420 名前:デフォルトの名無しさん mailto:sage [2020/08/22(土) 12:23:17.90 .net] ここ三年以内に発売されたハスケルの本は?
421 名前:デフォルトの名無しさん [2020/08/22(土) 13:18:34.82 ID:g0O87mtN.net] 空気読まずに有限集合でやってみる。 ``` code #{-# LANGUAGE ExistentialPython #-} import math; import random; import string; def none (): dot = lambda bc, ab: {a : bc [b] for a, b in ab.items ()}; make_map = lambda a, b: dict (zip (a, random.choices (b, k = len (a)))); A = tuple (range (5)); B = random.sample (string.ascii_lowercase, 10); C = random.sample (string.ascii_uppercase, 8); D = (math.nan, math.inf, None, (), 'hello', 'world'); ab = make_map (A, B); bc = make_map (B, C); cd = make_map (C, D); assert dot (cd, dot (bc, ab)) == dot (dot (cd, bc), ab); return ((A, B, C, D), (ab, bc, cd)); out = none (); ``` 自分の知る限り、素朴な写像の描像が描けないガジェットに対して「写像」という 言葉は使わないので、写像が結合的かどうかという議論に意味があると思えない。
422 名前:デフォルトの名無しさん [2020/08/22(土) 13:19:16.92 ID:g0O87mtN.net] ``` code #{-# LANGUAGE FunctionalJupyter #-} import IPython.display as display; def none (node, edge): f = lambda col, a: {key : (row, col) for row, key in enumerate (a)}; nodes = {}; for val in [f (j, a) for j, a in enumerate (node)]: nodes.update (val); edges = []; for xy in edge: edges += [(nodes [x], nodes [y]) for x, y in xy.items ()]; node_out = r"""<text class='clazz' x='{x}' y='{y}'>{z}</text>"""; edge_out = r"""<line class='clazz' x1='{x_0}' y1='{y_0}' x2='{x_1}' y2='{y_1}'/>"""; out = ''; w, h, dw = 100, 20, 20; for key, val in nodes.items (): out += node_out.format (x = w * val [1], y = h * val [0], z = key); for a, b in edges: out += edge_out.format (x_0 = w * a [1] + dw, y_0 = h * a [0], x_1 = w * b [1] - dw, y_1 = h * b [0]); style = r"""<style> text.clazz { dominant-baseline: middle; text-anchor: middle; } line.clazz { stroke: black; fill: none; } </style> """.strip (); svg = f"""<svg width='400' height='300' viewBox='{-20} {-20} {len (node) * w + 20} {max (map (len, node)) * h + 20}'>{out}</svg>"""; display.display (display.HTML (style + svg)); return None; none (*out); ```
423 名前:デフォルトの名無しさん [2020/08/22(土) 13:31:18 ID:DGMheHKA.net] それで? 会話や食事の中の唾液飛沫の3次元シミュレーションが出来るんですか?
424 名前:デフォルトの名無しさん [2020/08/22(土) 13:35:02 ID:j3K8XBr1.net] >>404 あれ、これ今日コンパイルしたらエラーが出た。 単にコンパイルしていなくて、ghciで用意されている(.)を使ってテストしていただけみたいです。 以下の合成関数のコードはおそらく正しいと思います。 comp :: (b -> c) -> (a -> b) -> a -> c comp = \f -> \g -> (\x -> f (g x))
425 名前:デフォルトの名無しさん [2020/08/22(土) 13:36:18.12 ID:j3K8XBr1.net] 圏論入門 Haskellで計算する具体例から (日本語) 単行本 ? 2020/8/19 雪田 修一 (著) この超人気の本を読んだ人いますか?