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/
521 名前:デフォルトの名無しさん [2020/09/13(日) 23:57:07.12 ID:Tso/1gLY.net] へ?何言ってんの もしかすると、何言ってんのが前の投稿にかかっちゃったかもしれない。 何も考えずに、何言ってんのおじさんプレイを楽しんでいるだけなので、 気にしないでほしい。 ついでなので。 `return x = x / x`という選択は、集合の圏では、取りうる唯一の選択肢かも しれない。自分も他に思いつかない。しかし、可換モノイドの圏では、 他にも選択肢がある。それも含めて、 [記事](https://ncatlab.org/nlab/show/Grothendieck+group+of+a+commutative+monoid) に全て書いてある。他人事なので断言してしまうが、この記事より詳しい 分数モナドの解説は地球上には存在しない。しかし、悲しいかな、 Haskellの解説記事と同じで、 * わかる人にはわかるが、 * わからん人にはなるほどわからん といういつものパターンになっていると思う。解説案件の宿命かもね。
522 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 02:32:09.85 ID:TxRaIMAU.net] >>=は何ですか?
523 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 02:44:47.64 ID:SnB9iMGf.net] 圏論わからんからなんもわからん
524 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 16:41:03.56 ID:TxRaIMAU.net] Monad という概念が数学の圏論の Monad から来るのはよく解説が見つかるんですが、Applicative (≒Monoidal) については数学からの意味付けが見つかりません コレ数学的にはなんなんですか?
525 名前:デフォルトの名無しさん mailto:sage [2020/09/14(月) 23:29:35.74 ID:XfiH3m4/.net] そのままじゃん アプリカティブファンクター なんだから、そのまま日本語訳でよくね つまり、関手 プログラマーにとって使いやすくしただけ ところで、”Applicative (≒Monoidal)”なのか? こっちの方がい意味不明なんだが モノイドって意味なら、≒モナド の方 モナイド則=モノイド則 モナドの方は、自己関手って条件が付くだけ しらんけど
526 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 00:17:11.21 ID:wUKRYY2O.net] >>519 まだ自分でハッキリ確かめたわけじゃないんですけど Applicative と Monoidal は同型なんだそうです https://qiita.com/Guvalif/items/7f893d9a078e03c9e425 まだこっちはどういう意味で“同型”になるのかわかってませんけど 数学的な意味でのMonadは英語のwikiに詳しく説明が載ってて↓ https://en.m.wikipedia.org/wiki/Monad_(category_theory) このFormal DefinitionがまさにHaskellのモナド則に繋がっていくのは確かめました 問題はApplicativeは圏論のどの概念に該当するのかの説明がサッパリ見つからないんです
527 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 02:19:25.61 ID:PObv6BQ8.net] (a -> b) -> (m a -> m b) m (a -> b) -> (m a -> m b) (a -> m b) -> (m a -> m b) こいつらは中央の->と左右の->を区別してないから数学的な意味が見えない returnとjoinは->が一つしかないから問題ないが
528 名前:デフォルトの名無しさん mailto:sage [2020/09/15(火) 10:15:51.98 ID:TeSbfrM9.net] >>521 そう、Haskellの圏論がらみの話はその“冪対象”(exponential object)が絡むのがややこしい しかしFunctorは当然としてMonadも冪対象を用いないで形式化されてる(というより計算論の世界への応用のずっと以前からある) Applicative(=Monoid?)はどやねんという話なんです 圏論の世界ではなかったものが計算論の世界に導入されてから考え出されたもんなんですかねぇ?
529 名前:デフォルトの名無しさん mailto:sage [2020/09/16(水) 01:31:29.62 ID:yuR5T5xB.net] strong lax monoical functor
530 名前:デフォルトの名無しさん mailto:sage [2020/09/16(水) 22:12:52.40 ID:CfmtxJKj.net] モノイド圏とかモノイド対象とかあんのだけど、モノイド(モノイダル)関手ってのもあんのね 読む気は無いんだけど、アプリカティブ関手とモノイダルXXが同型ってのは無いと思うが っておもったけど、関手同士なんだから、いくつか条件つければモナドとモノイドみたいな関係もありうるんかな? あとは、カン拡張、随伴、普遍性(極限だっけ?) どれかから相互に変換出来るだっけ?みたいなもん? どちらにしろ、定義の話で面白みは無いとは思うのだが
531 名前:デフォルトの名無しさん mailto:sage [2020/09/17(木) 10:32:26.07 ID:2a8IoKJu.net] 見つけた https://qiita.com/Guvalif/items/7f893d9a078e03c9e425 このサイトの人がまとめたpdfに書いてある とは言ってもやはりclosed categoryは仮定してる やっぱりapplicativeはmonadと違って“内部ホム”を持たない圏では定義できないんだろな “内部ホム”もつ圏でmonoidal functorに<*>を定義するのはわりと簡単だけど↓ F(X) × F(Y^X) →F(X×Y^X) (coherence) →F(Y) (F(eval)) https://en.m.wikipedia.org/wiki/Monoidal_functor pureが全然できんなぁと思ってたら“strong”という条件からpureが作れるんだな まぁHaskellて圏の話するときはHASKて言えればいいんだからコレでわかったことにしよ
532 名前:デフォルトの名無しさん [2020/09/28(月) 01:41:48.03 ID:0EuZ+v5t.net] [Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) の小さい例題の[html](https://pastebin.com/yxSRyg2u)をアップした。 async/awaitはPromiseのお助け文法になっているが、それは扱っていない。実行環境は、 [RStudio](https://rstudio.com/products/rstudio/)から [Node.js](https://nodejs.org/ja/)を呼び出している。
533 名前:デフォルトの名無しさん [2020/10/12(月) 16:08:54.17 ID:Wx/lfAmjI] 挑戦する馬鹿として生きるか?批判だけする雑魚として死ぬか? https://www.youtube.com/watch?v=4jlQlo1oC3E 奴隷職に就く★自ら奴隷を選んで不満を言う愚かさ https://www.youtube.com/watch?v=loD5ukKsZOk バカは騙され最低賃金でコキ使われる★物価とか関係なし https://www.youtube.com/watch?v=sQMrMfqdgrQ 勉強しないから奴隷人生★実業と人を残す人生哲学 https://www.youtube.com/watch?v=on2gURXi4Ks 正社員特権が「ブラック社員」を生む★正社員は訴え放題 https://www.youtube.com/watch?v=lSW1vc8-qMg 「で、年収は?」と聞くバカとは合わない社長業 https://www.youtube.com/watch?v=nEELEUhBLDk
534 名前:デフォルトの名無しさん mailto:sage [2020/10/14(水) 04:31:41.26 ID:+VLXbnA3.net] >>20 ワードカウントのロジックが不思議ちゃんだと思ったけどワードと空白の関係が "abc dd "みたいな行儀が良い書式じゃないとだめなんだな " "一文字スペースでワード数が1になってしまうみたいな countFile :: String -> (Int, Int, Int) countFile s = let (cs, ws, ls, _) = foldl' go (0, 0, 0, False) s in (cs, ws, ls) where go :: (Int, Int, Int, Bool) -> Char -> (Int, Int, Int, Bool) go (cs, ws, ls, wasSpace) c = let addLine | c == '\n' = 1 | otherwise = 0 addWord | wasSpace = 0 | isSpace c = 1 | otherwise = 0 in (cs + 1, ws + addWord, ls + addLine, isSpace c)
535 名前:デフォルトの名無しさん [2020/10/31(土) 09:11:59.11 ID:UJYxitvT.net] walk.northcol.org/haskell/adts/ >代数的データ型(algebraic data type)とは,図のように木構造で表現される値からなるデータ型のことです. 必ず木構造に限定されるんだろうか? OOPではオブジェクトグラフがありネットワークになりうるが、 Haskellでは絶対に木と考えて良いの?
536 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 12:29:50.75 ID:cEs7BAmA.net] いいんじゃない? 型の全体は文脈自由文法で規定されるクラスだから木になる希ガス
537 名前:デフォルトの名無しさん [2020/10/31(土) 12:34:33.57 ID:fxcwqRC2.net] この木なんの木きのこる木
538 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 12:37:07.03 ID:CAmth+XY.net] 見たこともない木ですから 独自実装のバグが出るでしょう
539 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 13:17:41.17 ID:cEs7BAmA.net] でもよくよく考えたらHaskellのデータ型って「展開できる表現がひとつもないデータ型」もありうるんだな 無限の木になる data InfiniteSequence = IS {car :: Int, cdr :: InfiniteSequence} arithSeq a d = IS a $ arithSeq (a+d) d term 0 (IS x y) = x term n (IS x y) = term (n-1) y main = print $ term 10 $ arithSeq 5 3 ---- 53
540 名前:デフォルトの名無しさん [2020/10/31(土) 13:26:01.44 ID:UJYxitvT.net] 再帰的なデータ型はグラフにできるのでは?
541 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 13:37:30.03 ID:B0ELcd4k.net] 最終的に暴走しないで展開が停止するものだけをデータ型と呼ぶならそうだけど、iterate (+4) 5 ですら無限の木になってしまう
542 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 21:13:27.13 ID:3k5Im+3l.net] haskellの配列は代数的データ型でばないのか?
543 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 22:07:18.29 ID:XiPKdEPZ.net] foldrなどの引数のことを代数的と言っていたような気がする 引数は(:)と[]でもいいし (+)と0でもいい 引数を渡すと関数 [a] -> b が返ってくるが これは関数というよりOOPの継承関係のような印象
544 名前:デフォルトの名無しさん mailto:sage [2020/10/31(土) 22:34:53.43 ID:B0ELcd4k.net] Haskell のデータ型は再帰を許すからな どうしても「終端記号(大文字から始まるData constructet) を木構造に並べたもの」という説明をしたいなら無限グラフを使わざるをえない
545 名前:デフォルトの名無しさん [2020/11/01(日) 07:14:51.56 ID:fIYIMdhR.net] walk.northcol.org/haskell/lists/#_%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E7%95%B3%E8%BE%BC%E3%81%BF 1)foldr (+) 0 [1, 2, 3] (+)とカッコがつく理由は? 2)map' f = foldr (\x a -> f x : a) [] xは[]の各要素?aは何?
546 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 08:58:44.92 ID:Srz4hpJo.net] 1) walk.northcol.org/haskell/operators/#_%E4%B8%AD%E7%BD%AE%E3%81%A8%E5%89%8D%E7%BD%AE%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88 2) このままだと対応する値が存在しないので、少し書き換える map' f xs = foldr (\x a -> f x : a) [] xs xはxsの各要素、aは最後の要素では[]で、 それ以前は後ろの要素に(\x a -> f x : a)を適用した結果
547 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 09:15:58.91 ID:v6ASK7zT.net] >>539 > > 1)foldr (+) 0 [1, 2, 3] > (+)とカッコがつく理由は? + がないと+は中置演算子で (foldr + 0) [1, 2, 3] になる (+)があると普通の関数としてfoldrの因数として解釈される > 2)map' f = foldr (\x a -> f x : a) [] > xは[]の各要素?aは何? []はfoldrの第3因数と同じ型の空集合 a は無名函数(\x a -> f x : a)の第2因数 定義に従ってmap' sin [] [5,6]] はわかりやすく(\x a -> sin x : a)を中置演算子++++で書くと(すなわちx ++++ a = (sin x) : aとすると) map' sin [] [5,6] = 5 ++++ ( 6 ++++ [] ) = 5 ++++ ( (sin 6) : [] ) = 5 ++++ [ (sin 6) ] = [ (sin 5) : [ (sin 6) ] = [ (sin 5) , (sin 6) ] となる
548 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:14:49.54 ID:1eMkmBeN.net] 因数?引数ではなく? Haskell用語なのかな
549 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:21:30.53 ID:Srz4hpJo.net] 1) foldr + 0 [1,2,3] と書いた場合、「+」より関数適用のほうが優先順位が高いので、 foldr + (0 [1,2,3]) と解釈される。 つまり、0という関数を[1,2,3]という引数に適用したものと、foldrを足し算するという意味となる 2) 具体例 map' f [1,2,3] = foldr (\x a -> f x : a) [1,2,3] 3番目の値 (\x a -> f x : a) 3 [] = f 3 : [] = [f 3] 2番目の値 (\x a -> f x : a) 2 [f 3] = f 2 : [f 3] = [f 2, f 3] 1番目の値 (\x a -> f x : a) 1 [f 2, f 3] = f 1 : [f 2, f 3] = [f 1, f 2, f 3]
550 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:25:40.23 ID:Srz4hpJo.net] おっと、具体例の「foldr (\x a -> f x : a) [1,2,3]」は 「foldr (\x a -> f x : a) [] [1,2,3]」の誤り
551 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:36:13.55 ID:B/d//mYI.net] い・・・引数
552 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 10:54:46.55 ID:z/eHKN3/.net] 引数です orz 普段“因数”の方が使う人なのでうっかりしたorz
553 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:03:53.67 ID:93fSMn/e.net] こ・・・因数
554 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:05:28.12 ID:z/eHKN3/.net] こ?
555 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:11:25.51 ID:4+fLUvoM.net] だ…因数
556 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 12:57:34.37 ID:9/8GaKcH.net] ひきすう
557 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 15:22:11.82 ID:N8AW169o.net] 引数を「ひきすう」と読むのは、同音異義語との混同を避けるための慣用読みだと思ってた 化学(ばけがく)、鼻腔(びくう)みたいな
558 名前:デフォルトの名無しさん [2020/11/01(日) 15:24:45.41 ID:BdB3gM+x.net] 返り血
559 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:34:03.38 ID:S9fsJ+JS.net] Parameterとargumentsの違いがよくわからない
560 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:44:50.76 ID:5aO2zs3I.net] https://qiita.com/yuba/items/141bdb2df407ee37417f だってよ
561 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 17:59:46.68 ID:S9fsJ+JS.net] よくわからんし一緒ってことか
562 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 00:43:34.64 ID:TnMF05Pn.net] 質問です このサイトでNum instanceをDerivingする話が出てました https://qiita.com/HirotoShioi/items/8a6107434337b30ce457 実際このページの次のコードはうちの環境でも通ります Haskell Online Compiler [ghc-8.4.4] Copyright (c) The University of Glasgow {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Quantity = Quantity Int deriving (Eq, Ord, Num, Show) a = Quantity 2 b = Quantity 6 totalQuantity :: Quantity totalQuantity = a + b -- Quantity 8 しかし次は通りません 通す事はできますか? import Text.ParserCombinators.Parsec import Text.Parsec (Parsec) newtype ParserInt = PI (Parser Int) deriving (Num)
563 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 00:43:43.72 ID:TnMF05Pn.net] ---- エラーメッセージ Haskell Online Compiler [ghc-8.4.4] Copyright (c) The University of Glasgow Compiling your program... [1 of 1] Compiling Main ( prog.hs, prog.o ) prog.hs:6:47: error: • No instance for (Num (Parser Int)) arising from the 'deriving' clause of a data type declaration Possible fix: use a standalone 'deriving instance' declaration, so you can specify the instance context yourself • When deriving the instance for (Num ParserInt) | 6 | newtype ParserInt = PI (Parser Int) deriving (Num) | ^^^
564 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 21:44:04.17 ID:aBc5dqas.net] こうすりゃ無理やり通すことはできるけど、 そもそもパーサ同士の足し算等々でどう動いて欲しいのか分からんから まともなインスタンス宣言が書けん {-# LANGUAGE FlexibleInstances #-} instance Num (Parser Int) where x + y = x x * y = x abs x = x signum x = x negate x = x fromInteger n = return 0
565 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 23:56:16.57 ID:Zq9JUsOb.net] >>558 元は別スレに出てた問題で 「与えられた文字列の中で“trickと"treat”どっちが先に出てくるか判定せよ」 なんです とりあえずparserを与える関数として makeP = mconcat . map ( manyTill anyChar . char ) でできました コレを例えば"abc"にapplyするとmtl = manyTill、ac=anyCharとして (mtl ac $ char 'a') <> (mtl ac $ char 'b') <> (mtl ac $ char 'c'> というparserになりコレにhiajklbcnという文字列をparseするとhijklとabcが出現するするまでに読み飛ばした文字列を返してくれます それでお題の答えとしてparseの結果を lastInd x s = case ( runParser ( makeP x ) () "" s ) of Left _ -> ( [ 2, 0 ] , x ) Right y -> ( [ 0, length $ x ++ y ], x ) のようにしてlengthで数えたんです しかしちょっと冗長なかんじがします そもそも読み飛ばした文字列なんか欲しいわけではなく読み飛ばした文字数が欲しいだけだからほんとは Parser String 型ではなく例えば length <$> ( manyTill anyChar ( char 'x') とかのParser Intで十分です 問題はコレをどうやって繋げて総和を返すコンビネータを作ろうかというところなんです Parser Stringはmonoid型を持ってるのでmconcat一発で繋げられるんですがParser IntはNum持ってないのでsum一発で繋げるというわけにはいかないんです なんとかできないかと探してみるとなんか「Numをderivingする」という記事を見つけて、お、コレでいけないかと色々やってみたんですがやはりParser Intにderiving一髪でNum入れる方法見つからなくてなんとかならんもんかと
566 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 01:59:40.73 ID:WdkpFDBO.net] わざわざNumのインスタンスにしなくても、これでいいのでは makeP = fmap sum . mapM ( fmap length . manyTill anyChar . char )
567 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 10:26:04.44 ID:qaG2IpUi.net] >>560 うん、まぁ別にNumのインスタンス入れなくてもこの問題の話だけならいくらでも方法はあると思うんだけど、そもそもモナドってもこういう時のためにあるんじゃないのかなと思って 例えば(+)なら Num a,Functor f のとき Num (f a)は自然には導出できない、なぜなら fmap (+) は f a -> f ( a - > a ) になってしまう しかし Applicative f なら lifaA2 (+) がピッタリ f a -> f a -> f a になって自然にキレイに Num (f a) が導出できる だからすごく理論的には自然なのに方法がないのは何故なんだろうと というかderiving (...) の (...) にかけるやつとダメなやつの基準がわからない 実用本位でよく使うやつだけ用意されてるに過ぎないのかな?
568 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 11:32:34.46 ID:WdkpFDBO.net] 一応、Num (f a)は導出できるけど、それで定義した(+)だと 交換則(x + y = y + x)が成り立つ保証がないからじゃないかねぇ (パーサの順番を入れ替えた場合を考えるとわかりやすい) {-# LANGUAGE FlexibleInstances #-} instance (Num a, Applicative f) => Num (f a) where x + y = (+) <$> x <*> y x * y = (*) <$> x <*> y abs x = abs <$> x signum x = signum <$> x negate x = negate <$> x fromInteger n = pure $ fromInteger n
569 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 11:50:57.17 ID:hn8kPJNe.net] >>562 なるほど、文法的に通っても意味的に文法には出てこない"Num rule"が補償されないからダメって事なのかな? まぁ今はclassのメンバ関数の自分が利用するやつだけ定義する必要無くなったみたいだから手で書いてもいいんだけど、>>556 の例だと newtype Eval a = Eval (ReaderT Env (ExceptT String Identity) a) deriving (Functor, Applicative, Monad, MonadReader Env, MonadError String) とかはmonad translater越しにできるし newtype Quantity = Quantity Int deriving (Eq, Ord, Num, Show) もできるのになんで Parser (Int) はあかんねんと なんかプラクマつけたらいけんもんかと Num くらいならいいけど Floating とかだと惨劇になってしまう
570 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 18:12:46.66 ID:oSP8TPsC.net] この話の面白いところは Parser Intという型を宣言する言語と そもそも型を宣言しない言語 どっちが生産性高いかってことだよ
571 名前:!id:ignore mailto:sage [2020/11/06(金) 20:16:57.19 ID:uZSEyxFl.net] stackくんさぁ、コンパイラのダウンロードが200MB強あるんだから、低速回線は途中で切断されるとかよくありそうなことじゃん サスペンド・レジューム機能搭載は必須じゃないのかね きょうびyoutube-dlでさえ向こうに切断Forbiddenされても今までダウンロードした分は残ってて、再度ダウンロードを開始した際には途中から残りの部分をダウンロードすように始まるってのにさ 仮に205.86 MiB / 205.87 MiBまで来て切断された場合 リトライすると0 MiB / 205.87 MiB からだなんてお互い不幸になると思わないのか? こっちは成功するまで永遠に繰り返すんだぞ? むしろそっちの方がそちらにとっても迷惑じゃん それとも低速回線は死ねっていう差別的思想を持っているのかね?
572 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 11:31:57.94 ID:Bx8aZf2L.net] 一方TeXはisoイメージを使った
573 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 13:05:47.79 .net] パターンガードの変数の束縛は局所的なのですが、全ての場合で共通して使用してほしい束縛はどうやりますか?
574 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 01:15:49.21 ID:4MQyK7K1.net] >>567 質問の意味がよく分からないのだが、コード例を出せる? こんな風に書けたらいいのに、みたいな。
575 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 19:55:38.03 .net] rootsInternal :: Quadratic -> Double -> Roots rootsInternal q d = let two_a = 2.0 * (a q) realpart = - (b q) / two_a dside d = (sqrt d) / two_a dpart = dside d complexpart = dside (-d) in if d==0 then -- Discriminant is zero, (single) root is real Root $ realpart :+ 0 else if d<0 then -- Discriminant is negative, roots are complex Roots (realpart :+ complexpart) (realpart :+ (-complexpart)) else -- Discriminant is positive, all roots are real Roots ((realpart + dpart) :+ 0) ((realpart - dpart) :+ 0) のlet 〜 in みたいなのを rootsInternal q d | d==0 = ... | d<0 = ... | otherwise = ... みたいな書き方の時にもやりたいんです
576 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 19:58:42.43 .net] おっと無用な改行が一々入っちゃった。。。
577 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 20:20:48.18 ID:UhW/CkjO.net] >>569-570 where で出来なかったっけ?だめだったかな?
578 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 21:00:20.89 .net] あ、できました。 お騒がせしました(////)
579 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 19:20:13.76 ID:qheOKxfd.net] 正格評価について質問です ひとつの引数しかない関数 f を正格評価するときには f $! x でよいようですが2引数の場合はどうするんですか? ( f $! x ) $! y で x, y を先に展開してくれますか? 良さげなんですがどう確かめたものやら なんか正格評価と遅延評価で格段に計算量が変わる f の例ってありますか?
580 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 21:38:04.29 ID:TR1bVb0l.net] 遅延評価がなくてもGCはメモリ解放を遅らせている GCをいじるにはIOが必要 $!を使うのにも少なくともモナドが必要と考えるのが自然なのでは? x' <- return $! x y' <- return $! y return $! (f x' y')
581 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 22:07:05.86 ID:F87BSTFR.net] >>574 そうなんですか? とりあえずモナドで試してみます 兎にも角にも正格評価と遅延評価でこんなに計算の回数が違ってくるってのなんかご存知ないですか? 例えばdpの例でFibonacciを f 0 = 0 f 1 = 1 f n = (f $ n-1) + (f $ n-2) と f' 0 = (0,1) f' n = (a+b,a) where (a,b) = f' (n-1) f = fst . f' で比べると目に見えて計算量が違うみたいな奴で「正格評価が効いてる」って目に見えてわかるような例があるとありがたいんですが
582 名前:デフォルトの名無しさん [2020/11/12(木) 14:57:12.09 ID:+Y5HOlnE.net] 正格評価と遅延評価で計算量が変わるといえばtaraiじゃね?
583 名前:デフォルトの名無しさん mailto:sage [2020/11/12(木) 23:16:18.57 ID:G64JuFLE.net] ⊥になるものでいいじゃん
584 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 06:27:56.29 ID:ewlhvLCU.net] trace や unsafePerformIO で評価順を調べられないかな
585 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 12:04:46.50 ID:oAmrFI5R.net] みなさん情報ありがとうございます 今んとこヒマな時にやってみた実現は cube x = x*x*x a x = case x of 0 -> 0 1 -> 1 _ -> ( a $ x -1 ) + ( a $ x - 2 ) main = do tA <- getCPUTime print $ cube $ a 38 tB <- getCPUTime print $ tB - tA と print $ cube $ a 38 → print $ a 38 の比較 結果 ---- 59722225363795389930809 3801127096000 ---- 39088169 3514055718000 この程度だとコンパイラが勝手にメモ化してくれるようで差がでないorz まだタライとかは試して見てません 取り急ぎご報告まで
586 名前:デフォルトの名無しさん mailto:sage [2020/11/16(月) 23:33:39.07 ID:bCg5e61i.net] >>573 もうとっくに解決したかもしれませんが、評価の順は trace 関数でも確認できます。 import Debug.Trace g :: Int -> Int -> Int g x y = trace ("g") (x + y) main :: IO () main = do let a = trace ("a") 1 let b = trace ("b") 2 let c = (g $! a) $! b putStrLn $ show c これを実行すれば、b a g 3 の順に出力されます。 正格評価されていると言えます。 ちなみに、($!) を ($) に変えれば、g a b 3 の順に出力されます。
587 名前:デフォルトの名無しさん mailto:sage [2020/11/18(水) 01:05:30.21 ID:VzwFaHaO.net] >>580 イヤ、まだ奮闘中です おぉ、そんな便利なものが 使ってみます
588 名前:デフォルトの名無しさん [2020/11/21(土) 23:31:14.57 ID:ak7brOTq.net] Haskellはライブラリの中身を覗くと Template Haskellを駆使した グッチャグチャの実質別言語みたいなコードがザラなのがなぁ・・・ 水面下の白鳥状態じゃねーか
589 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 16:59:26.57 ID:gt3QNmmg.net] ゴミライブラリ使うのやめて良いやつ作って公開してくれ
590 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 17:19:45.03 ID:MRtbpg3I.net] 在学中か学校出たての経験浅い奴しか担い手がいないのだろうからそんなもんなんだろう 純粋関数型言語は学生がかかるはしかみたいなもので やがて計算機科学の現状に絶望し去ってゆく 現在のコンピューターは手続き型に最適化されているのだ
591 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 18:37:00.71 ID:36XuvgN2.net] 単純に関数型言語がわかる人が少なすぎるからじゃないの?
592 名前:デフォルトの名無しさん mailto:sage [2020/11/22(日) 20:14:41.06 .net] 居飛車党と振り飛車党の闘いは続く
593 名前:デフォルトの名無しさん [2020/11/22(日) 23:16:18.31 ID:b60g3zenS] みずほが週休3日・4日を導入、副業もオッケーに!ただし給料は80%、60%に下がるが、あなたならどうする? https://www.excite.co.jp/news/article/Jcast_kaisha_396186/ みずほFG 週休3〜4日制導入へ 新型コロナで働き方見直し https://www3.nhk.or.jp/news/html/20201006/k10012651181000.html 副業OK時代!初心者に人気の副業を試してみて…メリット・デメリットとは https://news.yahoo.co.jp/articles/2a38649705f3257595512daee1a073c231affc51 「労働時間の見直し」に先鞭をつけた みずほフィナンシャルグループ https://blogos.com/article/490192/ 給料ダウンの危機を副業でカバーしたい…副業している人はどんな仕事でいくら稼いでいるの? https://news.yahoo.co.jp/articles/e56796283f3e4feea64cb3042ea7b4d7c01714e4 副業を会社に報告しない理由TOP3、3位会社が禁止している、2位告知されていない、1位は? https://dime.jp/genre/990902/ 副業年収1億超のmotoさんに聞いた!「本業」で成果を上げて自分の市場価値を高める方法 https://ddnavi.com/interview/679189/a/ フリーランス向け報酬即日払いサービス『先払い』が大規模リニューアルし正式リリース https://prtimes.jp/main/html/rd/p/000000042.000047439.html 国内最?級!副業・フリーランスエンジニアに特化した、仕事探しの求?アプリ 『doocyJob(ドーシージョブ)』、iOS版アプリを2020年10月6日(?)リリース https://prtimes.jp/main/html/rd/p/000000005.000038976.html
594 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 02:58:53.25 ID:v8DPq2Nr.net] イヤ、まぁ純粋に速度とか効率とか考えたら手続き型言語の方が優位なのはその通りでしょ? だって現在の計算機がノイマン型の手続き型の処理をするために設計されてるんだから そりゃバリバリにチューニングしたら手続き型言語には絶対勝てない
595 名前: その時代時代の最新の計算機の性能をフル活用しないとできないような処理は当面関数型言語の出番は回ってこない しかしそこまでの処理でないならやはり関数型言語の活躍できる場面も出てはくるだろうけど、しかし例えそうなったとしても手続き型言語も関数型言語も両方臨機応変に使いこなせるようになるとなると中々難しいから、結局どちらか選ぶなら手続き型言語という事になってしまう しばらくは関数型言語が実務の場面でバリバリ使われるようになるのは中々難しい 当面研究者とか、サンデープログラマーの趣味の世界でしか出番ないかもしれない [] [ここ壊れてます]
596 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 03:10:25.23 ID:i6Fa5mHr.net] 並列並行処理を型で表せる辺り、強力なんだけどなぁ
597 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 03:19:37.79 ID:vzAx9TtB.net] Reditを見てると、Haskellerの求人も結構あるんだが
598 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 12:02:25.91 ID:B9DSaA3p.net] 居飛車と振り飛車というのは危機感が足りない ガソリン車と電気自動車だ 個人の就職じゃなくて会社が丸ごと潰れるリスクを想定するための研究だよ
599 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 13:19:57.85 ID:XIoHPhIo.net] 一句できた! 『次に来る』 言われ続けて 数十年 (来ない)
600 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 13:27:42.48 ID:izonrGpC.net] 近未来 今となっては 古臭い
601 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 13:29:17.88 ID:XIoHPhIo.net] >>593 いいね!
602 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 14:40:17.74 ID:B9DSaA3p.net] 新しいなんて嘘つくより古いものは古いものとして扱う歴史や古文の方が正しい
603 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 20:51:18.66 .net] 関数型言語を処理するために設計されたコンピュータってどんな構造なんだろ
604 名前:デフォルトの名無しさん mailto:sage [2020/11/23(月) 21:33:53.00 ID:B9DSaA3p.net] みんなが数学好きで自己啓発嫌いなのは処理速度じゃなくて 嘘をつかないかどうかの問題
605 名前:デフォルトの名無しさん mailto:sage [2020/11/24(火) 01:11:11.02 ID:wCic/rFb.net] >>596 LISPマシンというものがかつてありましたなあ
606 名前:デフォルトの名無しさん mailto:sage [2020/11/24(火) 03:49:22.53 ID:EBaS3Lgi.net] JAVAチップが実現されてればスタックマシンだからFORTH最強だったのでは
607 名前:デフォルトの名無しさん mailto:sage [2020/11/24(火) 21:00:48.17 ID:BgPUrN9t.net] 速度は実はそこまで重要じゃない 飛行機からメンテナンスハッチ取り除いて何kg軽量化しましたって言ったところで、仕事好き定量評価好きなにわかが、わかりやすい数字見て喜ぶだけで、実際はそんな嬉しい話じゃない というかそもそももっと遅いスクリプト言語は流行ってるし
608 名前:デフォルトの名無しさん mailto:sage [2020/11/24(火) 21:12:41.51 .net] Haskell でゲーム開発したいんですが FRP は死滅しちゃったの?
609 名前:デフォルトの名無しさん mailto:sage [2020/11/24(火) 21:44:37.33 ID:2dUwtFIm.net] >>601 死滅の意味がよく分からんが、問題なく使える。 stackageにもあるでしょ。 それはそうと、なんで初めから難しいFRPを使おうとするの? 普通に素直に設計して作ってみればいいのに。
610 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 15:39:12.43 ID:nSv/4rn0.net] bind演算子の名前の由来ってなに? なにも束縛してなくね?
611 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 17:26:29.13 ID:+w97lXkL.net] a >>= b がdo記法で do x <- a b x みたいになるからじゃね?
612 名前:デフォルトの名無しさん mailto:sage [2020/11/30(月) 21:06:13.38 ID:qo5X+4ip.net] (>>) これも bind と言うよ
613 名前:デフォルトの名無しさん [2020/12/02(水) 00:25:53.39 ID:E6FeESB6.net] ここで聞いていいのかわからないけど… Nixのいいチュートリアルとかってある?
614 名前:デフォルトの名無しさん mailto:sage [2020/12/04(金) 21:16:59.61 ID:kdWDDBYk.net] これとかどう? https://github.com/Gabriel439/haskell-nix
615 名前:デフォルトの名無しさん [2020/12/05(土) 12:39:37.62 ID:Na39OKS5.net] ブログ書いてたら彼女と無料で海外留学という名のデートに行けた話【影響力やばい】 https://www.youtube.com/watch?v=Y8Q1z3Mi7BQ 若いうちから人を雇ったり、任せるクセをつけるべき理由とは? https://www.youtube.com/watch?v=6yAvDQxhldI 【対談】インフルエンサーマーケティングに300万円突っ込んでみた結果... https://www.youtube.com/watch?v=AMjWD0F8PLQ 収入を上げたければ、自分の影分身を作るべし https://www.youtube.com/watch?v=V3Kc-lUxH88 勉強のために10日間で21個のアプリを作った話【初心者時のプログラミング学習】 https://www.youtube.com/watch?v=JkN5kmR9dgk 学校では教えてくれないことの中にはお宝が眠っている https://www.youtube.com/watch?v=oq92u9nJ7FY ブロガーからステップアップしていくために必要なスキル https://www.youtube.com/watch?v=F6qsOyRIaQE
616 名前:デフォルトの名無しさん [2020/12/05(土) 23:01:31.80 ID:gIoCKCst.net] >>607 すごい良さげ。ありがとう
617 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 23:45:36.72 ID:gZAhFzLL.net] >>608 すごい良さげ。ありがとう
618 名前:デフォルトの名無しさん mailto:sage [2020/12/06(日) 02:18:39.34 ID:HA18eG30.net] >>608 グロ
619 名前:デフォルトの名無しさん [2020/12/08(火) 09:15:41.98 ID:VKXi32Vk.net] 実際にちょっとしたプログラム書いてみると メモリ周りの最適化が困難なんだよなこの言語。 しかも最適化の方向性がアルゴリズムの改良ではなく 言語特有のボトルネックの回避がメインになるから コードを見ても最適化の意図が分かりにくくて 一見無駄に冗長に記述してるだけに見えるコードが出来上がる。
620 名前:デフォルトの名無しさん mailto:sage [2020/12/08(火) 11:08:46.52 ID:EAPrHNYX.net] 最適化の意図なんてPythonと同じでいい ライブラリは全部Cで書いてmainだけHaskellで書け
621 名前:デフォルトの名無しさん mailto:sage [2020/12/08(火) 12:02:52.73 ID:mZ7rlOd+.net] 一時期あんなにモナドの記事とか書かれまくったのに、最近盛り上がりに欠ける Haskell製アプリも企業が採用したって話もほとんど聞かないけど、気のせい? 尖ったところで使われてるんかな