20/05/23 12:08:02 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:デフォルトの名無しさん
20/05/23 13:15:18.54 eKnPDQS2.net
あ、ストリームでできたってこういうことか
335:デフォルトの名無しさん
20/05/24 19:39:02 A0PpU4F1.net
HaskellのフレームワークってGHC拡張たくさん使われてるから、基本的な文法だけ知ってても、エラーが出たら意味分からなくなるという初心者泣かせな言語だな。地道にコツコツ知らないことを勉強してってるわ。
使いこなしてる人ホンマ羨ましい。
336:デフォルトの名無しさん
20/05/24 22:41:15 oexHBYog.net
The state of GHC on ARM
URLリンク(www.haskell.org)
337:デフォルトの名無しさん
20/05/25 14:19:28 HRWjfAZ+.net
>>331
そういう悪い所を悪いと言えないのが初心者で
初心者の甘い評価がなければ持続不可能なのがGHCじゃないか
338:デフォルトの名無しさん
20/05/25 19:07:59 b4izxg0D.net
むしろ俺は段階的に学べていいと思ったが
339:デフォルトの名無しさん
20/05/26 13:27:47.52 w7oGlmub.net
haskellのフレームワークとやらが具体的に何を指しているのか分からん。
YesodやServantなどのWebフレームワークしか思いつかんが。
いずれにしても、そもそも初心者がフレームワークに頼るべきではない。
初心者を抜けて、さぁ本格的なアプリでも作ってみるかとなった時に使えばいい。
初心者は15パズルやTODOツールみたいな簡単なアプリをフルスクラッチで作ってみて、
言語拡張の必要性や、有用なライブラリの使い方を少しずつ学ぶことを奨める。
340:デフォルトの名無しさん
20/05/27 11:14:49 xJStjlCD.net
そういうのはつまらんのだよ
341:デフォルトの名無しさん
20/05/27 13:16:13 SIsgBJ88.net
>>336
初心者が面白いと思える学べる題材ってなんかあるかな?
C#だとゲームとかGUIとか簡単なのになぁ
Pythonだって色々思い浮かぶのに
342:デフォルトの名無しさん
20/05/27 17:32:08 Ro2X8Fae.net
プロジェクトオイラーでもやったら
343:デフォルトの名無しさん
20/05/29 00:14:38.34 Hx2r4buk.net
haskell興味あるのですがhaskellの長所と短所ってなんですかる
344:デフォルトの名無しさん
20/05/29 00:57:51.48 .net
若さと情熱に身を任せたいなら C、衰えても続けたいなら Haskell
345:デフォルトの名無しさん
20/05/29 07:22:48 mJaFRwIH.net
GoとRustが無かった時代には長所がいっぱいあったんだろう
もし、その時代のコードを変更することなく今使えるならそれも長所だが
346:デフォルトの名無しさん
20/05/29 07:54:35.82 7l9AMad4.net
>>339
長所は難しいことをより難しく書けること
短所は簡単なことでも難しく書かざるを得ないこと
本質的に純粋関数だけじゃリリースできないことも大問題ではある
切り分けで対処しても破壊を含むコードは必ず走る
理想が現実に敗北したような体系だから手を出さないほうがいいよ
347:デフォルトの名無しさん
20/05/29 08:30:23.80 wwuYcwOw.net
>>339
長所は、宣言的に分かりやすく書いたプログラムが意図通りにちゃんと動くことです。
何をするのかと、どのようにするのか、この二者をきっちり分けてプログラムできるのがHaskellの大きな魅力です。
(できると言っても、初心者が簡単にできることではありません。 その方向に正しく精進する必要があります。)
短所は、少し上のレスでも言及されていますが、入門を抜けた後に何に取り組めば良いのか分からなくなることです。
始めから何か目的があってHaskellを学び始めたのでしたら良いのですが、そうでなければ、
魅力的な題材の無さに愕然とし、路頭に迷うことになるでしょう。
実はgithub等を漁れば先輩方の様々はジャンルの非常に参考になるプログラムを数多く拝見でき、
自分も取り組んでみたくなる題材がたくさん見つかるのですが、逆に言えばそうやって努力して探さないと見つかりません。
348:デフォルトの名無しさん
20/05/29 09:57:17 zRWEM9Qa.net
>>342
後半、そういう批判よくあるけど毎回何言ってんのかよくわからん
お前達は何を批判してるの?
349:デフォルトの名無しさん
20/05/29 10:24:25.66 mJaFRwIH.net
過激派と思ってた奴に中道の仕事を奪われる
理論的にありえないと思っていた中道と中道の対立が現実になる
350:デフォルトの名無しさん
20/05/29 11:22:41 xO3kN7Ry.net
どんなに多くの短所があろうが
それらに勝る長所が一つあれば好きになる
人でもプログラミング言語でも
351:デフォルトの名無しさん
20/05/29 11:35:07 OBuVVMWP.net
>>339
Haskellに対して懐疑的だった初学者がParsec使ってパーサー書いてみた感じだと
長所
バグ皆無のパーサーをBNFを書き写すように簡潔に書ける
(自分はCやrubyでは書けなかった)
問題に応じて言語内言語を作れるので、コードの量を極めて少なくできる
短所
yaccやbisonより学ぶのにかなり時間がかかりそう
言語内言語を作れてしまうので、ぱっと見ただけではコードを理解できない
(数式を理解するには記号の意味を理解している必要があるのと同じ)
yaccやbisonを使った経験は無い
だが、Haskellの方が応用が利き問題の解決の仕方が美しいので学びたいとは思わなくなった
解決したい具体的な問題があり、自分が学んできた言語だとコードが大きく複雑になりそうで、新しい概念を学ぶ余裕と覚悟があるなら良いと思う
ただ便利そうなのを探してるとか興味があるってだけだと挫折するかも
Haskellを参考にしたより新しい言語を学ぶ方がスマートかもしれない
自分みたいにHaskellに懐疑的で徹底的に学んで悪口書いてやろうと思っているならマジお勧めwww
352:デフォルトの名無しさん
20/05/30 19:36:21.64 /U1uledC.net
>>339
長所: 多くのバグをコンパイル時に潰せる
短所: 手続き型プログラミングにおける既知の資産(アルゴリズムなど)が活用しにくい
353:デフォルトの名無しさん
20/06/01 05:07:50.77 seoK/8uJ.net
Ocamlを使わないといけなくなっていじり始めたけど、あれもこれも出来なくて不便だな
やたら冗長になるし…
354:デフォルトの名無しさん
20/06/01 07:39:57.03 L1Mt0gVE.net
書くのが不便になる代わりに、ぱっと見ただけで理解できるコードになる
という軍師の言葉をぱっと見ただけで信じる者だけがOCamlを使いなさい
355:デフォルトの名無しさん
20/06/01 08:15:03 dkkr+KCk.net
>>349
できないことの例を教えてください
356:デフォルトの名無しさん
20/06/02 01:46:24.39 UWOmEsh4.net
>>329
>>330
やはり純粋なリストだけでは望む仕組みは作れないという結論に達しました。
逆に言えば、そういう事が容易にできるのがストリームの利点の一つなのだと理解しました。
ありがとうございました。
357:デフォルトの名無しさん
20/06/05 23:44:13.56 aqmhehrv.net
memptyってなんでmunitやmidとかじゃないんだろうな?
emptyの心がよーわからん
文字列のように意味的に空なモノイドもあるが、
空じゃない例の方が圧倒的に多く一般的じゃないか?
ま、どうでもいいんだけどな
358:デフォルトの名無しさん
20/06/06 08:31:53.87 .net
let nop = mempty in ...ってやってる(嘘)
359:デフォルトの名無しさん
20/06/10 18:32:52.39 vPvQB3B1.net
top level の型の指定についての質問です。
haskellのルールでtop levelでないところでは曖昧な型で型推論してくれて通るけど、top levelでは一意に型が決まらないとダメとかなんとかそういうルールがあって、
それでハマって苦労した記憶があるんですが、今その事ふっと思い出したんですが、詳しい内容が思い出せません。
haskell ambiguous top level
とかでグクってもそれらしい話しが出てこないんですけど、なんか思い当たる方おられませんか?
360:デフォルトの名無しさん
20/06/11 20:57:26 h7Wncfkb.net
>>355
どういうことか、何か例を挙げることはできますか?
361:デフォルトの名無しさん
20/06/11 23:57:59 oU50Re4d.net
>>356
レスありがとうございます。
当時なんかのプログラム組んでてハマったんですが、どんな例だったかは思い出せません。
しかし制限の名前はわかりました。
monomorphic restriction (単相性制限) という奴でした。
ググってみると多相性を無制限に認めてしまうとメモ化の実装が難しくなるようで性能に影響してしまう事を避けるための制限のようです。
こまめに型宣言書くようにするか、性能を犠牲にしてもよいなら制限をなくすオプションとかもghcとかには用意されてるので実害は無いんですけど、昔ハマって原因突き止めるのにエライ苦労したのでなんだったかふっと気になってお聞きしました。
お騒がせしました。
362:デフォルトの名無しさん
20/06/12 03:07:06 YpUxhodA.net
>>357
いえ、お気になさらず。
こちらも勉強になりました。
363:デフォルトの名無しさん
20/06/20 10:17:27.94 6v+H5Lhm.net
今、最新のghcでdependent typesは使えますか?
364:デフォルトの名無しさん
20/06/23 00:33:49.50 2ZCsz0wY.net
次の2つの関数の型の違いを説明していただけないでしょうか。
f :: C a => T a -> b -> b
g :: T a -> (C a => b) -> b
関数gのようなconstraintの使い方にはこのような効果や意味がある、
とはっきり説明できず、モヤモヤしています。
また、このようなconstraintの使い方には特別な用語があるのでしょうか。
webで検索して調べてはいますが、適切なキーワードが思いつかず、苦労しています。
365:デフォルトの名無しさん
20/06/27 16:04:56.51 FJC3hMrg.net
Haskell用語だけでは説明できない気がする
C++用語で
a -> bのaとbはtemplateを実体化する引数
C a => bはtemplateの宣言であって実体化ではないのでgは意味がわからない
366:デフォルトの名無しさん
20/06/28 01:53:39.90 .net
Steamで買えるHaskell製ゲームを教えて
367:デフォルトの名無しさん
20/06/28 10:31:17 hu4PmWPn.net
>>361
レスありがとうございます。
すいません、C++に精通していないため、templateの実体化や宣言の意味がよく分かりません。
件の関数型は次のブログにありました。
Introduction to Singletons (Part 1)
URLリンク(blog.jle.im)
ここの Going backwards の節です。
(昔、別のWebページでも見て、その時も不思議に思っていたのですが、どこのページだったか忘れてしまいました)
そこでは
withSingDSI :: SingDS s -> (SingDSI s => r) -> r
という型です。
確かに SingDSI s => のconstraintを外すと、この関数を呼び出すところで型エラーとなってコンパイルできません。
代わりに、型シグネチャの先頭に SingDSI s => を書いたとしても、です。
しかし、なぜ型が合わないのか理由が分かりません。
何かしらの意味があるはずなのですが・・・
368:デフォルトの名無しさん
20/06/29 23:47:59.12 MeiET0BU.net
>>363
のリンク先の話は中々勉強になるなぁ。
自分でこんなの使いこなせるようになるとは思えないけど。
369:デフォルトの名無しさん
20/07/02 23:40:38 Rg/xVuvf.net
>>360
Haskell勉強中で答えられるほどの知識無いけど
constraintの意味から察するに、右の引数の型が正格評価されていないうちには受け入れないということでは
遅延的に型を選択して返すような関数は作れるけど、それを明示せずに正格評価の関数に渡せてしまうと追跡困難になる
引数の型を決定しておかないと渡せないようになってるんじゃないかな
つまり、前者は第一引数の型を指定してて、後者は第二引数の型を指定しているというだけだと思う
知らんけど
370:デフォルトの名無しさん
20/07/04 23:44:16 LjgILXlp.net
すごいブログを見てしまった後では気が引けるが、前に書いた随伴をhtmlにした
[デフォルトの名無しさん](URLリンク(pastebin.com))
なんか動いているな、程度の確認しかしていないのでバギーだと思う
サイズが大きいけどほとんどがcss
パット見、jsは、require, jquery, mathjaxぐらい
実行環境はihaskell
371:デフォルトの名無しさん
20/07/27 22:40:30.17 XpS4ozgV.net
遅延評価のありがたみよくわからんかったけど
なんとなく分かった
使うか使わない情報、ひとまとめに定義したいんだけど
使わないのなら、情報取りに行くだけ無駄
でも、遅延評価なら、無駄と思える情報も定義できる
なぜなら、使って初めて情報を取りに行くのだから
なるほどね と思った
372:デフォルトの名無しさん
20/07/27 22:51:22.29 u9oz0ryS.net
有名人だらけで楽しみですな。
URLリンク(haskell.love)
373:デフォルトの名無しさん
20/08/13 17:57:45.06 AeuuY+wz.net
圏論入門 Haskellで計算する具体例から
雪田修一 (単行本)
という本が近々出るので、Haskellの予習のためにHaskellの本を買いました。
プログラミング環境は何をインストールするのがおすすめでしょうか?
OSはWindows 10を使っています。
374:デフォルトの名無しさん
20/08/13 18:55:01.02 AeuuY+wz.net
Haskell Platformというのがいいみたいですね。
でもダウンロードしようとしたら、まず、Chocolateyとかいうのをインストールしなくちゃいけないんですね。
大丈夫ですか?これ?
375:デフォルトの名無しさん
20/08/13 21:17:46.02 .net
Windows Subsystem for Linux 2 (WSL for short)を有効化してWSL用ディストリビューション(Ubuntu 20.04 LTSなど)をWindows ストアからインストールすることで、Windows内で仮想的にリナックスを使ってそこでHaskellを始めるのが良いです
376:デフォルトの名無しさん
20/08/13 21:24:06.64 AeuuY+wz.net
Windowsと比較してリナックスの利点は何でしょうか?
大きなアドバンテージはありますか?
377:デフォルトの名無しさん
20/08/14 06:03:07.79 OycuixUd.net
>>370
今のHaskell Platformのインストールってそういう感じになってるんだな
Chocolatey自体はWindowsでそこそこよく使われているパッケージマネージャなので一応信頼してよい
378:デフォルトの名無しさん
20/08/14 08:46:51 XgOd4/dA.net
>>371
Windowsにそのままインストールしちゃいました。
Windows PowerShellから起動する以外の使い方はないでしょうか?
GHCiというのもグラフィカルユーザーインターフェースのソフトはないのでしょうか?
379:デフォルトの名無しさん
20/08/14 12:57:45.74 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:デフォルトの名無しさん
20/08/14 17:17:33.31 58KQIAkg.net
>>375
副作用のあるコードの書き方を見せるのは簡単だけど、関数型が初めてなら
まずはHaskellのチュートリアルを読んで関数型の考え方を出来るようになったほうがいい
381:デフォルトの名無しさん
20/08/14 17:46:17.87 XgOd4/dA.net
>>376
ありがとうございます。
「すごいHaskellたのしく学ぼう!」という本の第1章を読み終わりました。この本を読んでいこうと思います。
382:デフォルトの名無しさん
20/08/14 20:54:14.09 .net
なぜエラーになるかといえば、タプルにdropはないからです
リストは『全て同じ型』の要素の片方向リストです。要素数は可変です。C++のforward_listをイメージしてください
タプルは『それぞれ好きな型の組み合わせ』であり、リストではありません。要素数は固定です
両者は本質的に内部実装が異なります。リストは要素と、次に辿る先の情報を組にしたデータ構造、一方でタプルはその数だけデータを納めるのみのデータ構造です
抽象的には、リストは2要素のタプルであり、一項目に要素、二項目は(再帰的に)リストを保有します。
こうすることで、二項目を見れば(リストなので)『要素と、二項目にまたリスト』が格納されています
そのリストの二項目を見れば・・・となって単方向リストが実装できている事が理解できます
タプル(,)は二項関数であるとみなせます。コンマの左側と右側に一つずつ何かを取って入れる関数です。
リストでは実際は『:』という二項関数が二項タプルと同じ役目を果たします。つまり
要素 : リスト
のように書き
(要素, リスト)
と抽象的に同じであると気づくことができます。
383:デフォルトの名無しさん
20/08/14 21:56:07.86 19vTStSCU
【A型の人ごめん】「まじめ人間」は、自分の人生を生きられず、しかもお金持ちになれない。
URLリンク(www.youtube.com)
【人生観変わる話】「サラリーマン脳」のヤバい特徴5選。
URLリンク(www.youtube.com)
【人生終了】情弱がハマる「貧困スパイラル」のリアル。
URLリンク(www.youtube.com)
バカでもわかる!ネットビジネスの始め方。
URLリンク(www.youtube.com)
時給労働から卒業しよう!貧乏人が知らない「お金の稼ぎ方」まとめ。
URLリンク(www.youtube.com)
【人生攻略】経験・実績ゼロのあなたが、最短で何者かになる方法。
URLリンク(www.youtube.com)
空気を読んで生きてる「まじめ人間」は成功しないよ。
URLリンク(www.youtube.com)
【残酷】貧乏人はいつも忙しいのに、お金持ちは暇である理由。
URLリンク(www.youtube.com)
384:デフォルトの名無しさん
20/08/14 23:21:17.25 OycuixUd.net
>>375
コンパイルエラーの文章を読んでぐぐる癖をつけよう
覚えはじめの頃に出会うエラーは大抵は文法ミスか型エラーだろうから
ぐぐれば「何が悪いか」はだいたい解決する
「なぜ悪いか」はすごいHaskellあたりを読み進めていけば習得できるはず
385:デフォルトの名無しさん
20/08/15 17:24:00.25 uxgG4TyL.net
>>378-380
ありがとうございました。
386:デフォルトの名無しさん
20/08/16 18:14:55.92 tHIsB9jz.net
Haskellの本を読んでいると静的型付けだとか出てきます。
単にHaskellの仕様を理解するだけでなくもっと深く、どういう考え方でHaskellというプログラミング言語が設計されたのかにも興味があります。
プログラミング言語論みたいな本でおすすめの本はないでしょうか?
387:デフォルトの名無しさん
20/08/16 21:18:57.26 EuDMb00g.net
Haskellはある日突然に誕生したわけではなく、
その前身のMirandaとKRCという関数型言語から
多くの特質を受け継いでいます
これら言語に関してはW*k*p*d*aで簡潔に解説されてるので、
まずそちらを一読したのちに参考文献に当たるべきでしょう
以下ではW*k*p*d*aで欠けている日本語の文献を紹介します
Miranda
[1] 第7章 Miranda, p139-163,
新しいプログラミング・パラダイム, 共立出版, 1989年
URLリンク(www.am*z*n.c*.j*)
Mirandaに関する包括的な解説
[2] 関数プログラミング, 近代科学社, 1991年
URLリンク(www.am*z*n.c*.j*)
Mirandaを用いた関数型プログラミングの入門書
モナドを含む圏論の応用/発展が誕生する以前の時代に書かれた貴重な教科書
KRC
[3] 4. 関数型言語 KRC, p36-47,
新世代プログラミング, 共立出版, 1986年
URLリンク(www.am*z*n.c*.j*)
[4] 6.2 KRC (Kent Recursive Caluculator), p132-142,
プログラミング言語の新潮流, 共立出版, 1988年
URLリンク(www.am*z*n.c*.j*)
[3], [4] ともKRCに関する包括的な解説
KRCはすでにインデントベースの構文/純粋関数型/ パターンマッチ/リスト内包表記
といった特質を備えた動的型付け関数型言語でした
388:デフォルトの名無しさん
20/08/16 21:54:00.05 jqjR96Dg.net
>>382
まず、Types and programming languages とSteve Awodey の Category Theory 読んでからや。
Haskell の話するのは。
389:デフォルトの名無しさん
20/08/16 22:04:09.80 mrCar2cd.net
Haskellは魔窟の巣窟や 近寄るものは内臓から食い散らかされるデー
初心者はPythonが最適やろ~
390:デフォルトの名無しさん
20/08/17 17:36:03 CFLjXFs2.net
>>383-384
ありがとうございました。
Types and programming languagesというのが比較的新しい本なので、興味を持ちました。
391:デフォルトの名無しさん
20/08/17 18:54:59.27 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:デフォルトの名無しさん
20/08/17 19:01:32.08 QJrG17W6.net
>>387
Haskell初心者に限った事柄ではないけれど、
こうした場で質問する者の心構えとして
出てしまったエラーメッセージをコピペする
といった、当たり前の行動は身につけるべきだと思うよ
393:デフォルトの名無しさん
20/08/17 19:03:19.26 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:デフォルトの名無しさん
20/08/17 19:05:47.77 CFLjXFs2.net
インデントも間違っていないと思いますし、カッコも問題ないと思うのですが。
395:デフォルトの名無しさん
20/08/17 20:38:28.08 0Q701Csj.net
>>390
>>387 をコピペしたら、俺の環境では動いたよ。
取り急ぎ。
396:デフォルトの名無しさん
20/08/18 02:46:50.61 rj5JRKyz.net
153行より前の部分がおかしいんでしょ
397:デフォルトの名無しさん
20/08/18 10:50:34 QANbTDtx.net
>>391-392
ありがとうございました。
>>392
ご指摘どおりでした。ありがとうございました。
398:デフォルトの名無しさん
20/08/19 15:58:22.36 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:デフォルトの名無しさん
20/08/19 15:59:38.45 FHOhxH/M.net
単なる表現方法と割り切ればいいのでしょうか?
400:デフォルトの名無しさん
20/08/19 16:07:34.77 FHOhxH/M.net
nに対して、「mにn+mを対応させる関数」を対応させる関数の表記法として、
add' n m = n + m
を採用するというのが非常に不自然に思います。
401:デフォルトの名無しさん
20/08/19 16:24:31.96 amUamLwq.net
入門書のカリー化の箇所を読めばいいんじゃね
haskell内での関数は一変数関数として扱えて、
add' n m = (add' n) m
というだけ
402:デフォルトの名無しさん
20/08/19 16:31:52.13 FHOhxH/M.net
>>397
ありがとうございます。
(1)の表記法だけ許してほしいと思うんです。(2)だけみたらまるで2変数関数のように見えますから。
403:デフォルトの名無しさん
20/08/19 20:35:34.21 1ghAy1sC.net
(今は結合性と優先順位は無視していいので)
n + m
は
(+) n m
と同じ意味になる。
つまり(2)は
add = (+)
に変数を明示して右辺の演算子を中置記法に戻しただけ
むしろ変数増やしたのが見にくい原因
404:デフォルトの名無しさん
20/08/20 07:58:20.18 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:デフォルトの名無しさん
20/08/20 08:57:36.69 LuBKaaMH.net
>>399-400
ありがとうございます。
>>400
(0)
add :: Int -> Int -> Int
add = \n -> \m -> n + m
この書き方が本質的で一番わかりやすいですね。
ありがとうございます。
406:デフォルトの名無しさん
20/08/20 11:51:35 LuBKaaMH.net
圏論入門 Haskellで計算する具体例から
雪田修一 (単行本)
図書館に購入リクエスト済みです。楽しみです。
407:デフォルトの名無しさん
20/08/20 14:53:48.13 uVfTx7sc.net
>>1 simulationライブラリで純粋な関数式プログラミングをする URLリンク(x0000.net)<)
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
URLリンク(up.x0000.net)
408:デフォルトの名無しさん
20/08/21 10:45:55 VIa1N6p8.net
関数の合成をする関数(.)を以下のように誤って書きました。
(x -> f (g x))はラムダ関数なので(\x -> f (g x))と書かないといけないと思います。
ですが、以下のコードでちゃんと動作しました。なぜでしょうか?
(.) :: (b -> c) -> (a -> b) -> a -> c
. = \g -> f -> (x -> f (g x))
409:デフォルトの名無しさん
20/08/21 11:35:07.30 VIa1N6p8.net
あともう一つ質問があります。
「すごいHaskellたのしく学ぼう!」に「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
と書いてありますが、左結合だったとしても、同様に一度にたくさんの関数を合成できるはずです。
左結合だったとしてもf (g (z x))は(f . g. z) xと等価であることに変わりはないはずです。
これは一体何が言いたいのでしょうか?
410:デフォルトの名無しさん
20/08/21 18:51:58.39 3Xa4QDEo.net
>>405
左結合だと等価にならないよ
411:デフォルトの名無しさん
20/08/21 18:53:55 VIa1N6p8.net
(f . g) . z = f . (g . z)だから等価だと思ったんですけど、間違っていますか?
412:デフォルトの名無しさん
20/08/21 20:51:03.06 3LvfPoDL.net
通常の関数適用は左結合だから
f g z x は ((f g) z) x と同じ意味になって
コンパイルエラーになっちゃうけど
関数合成演算子を使うと括弧が減るよ、ということが言いたいはず
関数合成自体は結合的だからそこの向きは確かに関係ないね
413:デフォルトの名無しさん
20/08/21 22:34:08.88 nqLClnr+.net
>>405
単純に
>f (g (z x))は(f . g. z) xと等価です。
は、数学と同じ優先順位ですよってことじゃない?
それ以上の疑問は抱かんかったけど
試してないけど、俺も>>406に同意
多分整数演算で除算演算の関数を関数合成すれば、いくつか試せば同一にならないのは簡単に見つかるはず
引数をたくさん試すだけでも見つかりそう めんどこっいのでやらないけど
414:デフォルトの名無しさん
20/08/21 23:19:07.20 nqLClnr+.net
>>407
それってそうなの?
俺は、数学の本好きで読んでるんだけど、そこまで基本的なことは突き詰めてないw
写像の合成が結合則を満たす ものもたくさんありそうだけど、
写像の合成は必ず結合則を満たすものなの?そこから疑問に思った方がいいんじゃない?
数学の本読んでると、右XXと左XXと区別するものが多いんで、普通に満たさないと思ってたw
いや、俺が間違ってるかもしれんから、そこから調べてくれると俺もうれしい
ちなみに、大学数学レベルなのが 1+1=2 の証明。俺は調べたくないw
415:デフォルトの名無しさん
20/08/22 00:32:18.31 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:デフォルトの名無しさん
20/08/22 00:48:03.06 66roH7xF.net
>>410
しらんけど、位相空間って連続写像仮定してないか?
プログラミング言語でいう写像とは違う
位相空間論で一般的に言われているのならその定理を示した方がいいんじゃない?
個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。
>あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
こっちはたぶん書籍持ってるかな?ページ数教えてくれる?
四則演算というか群論でいう、逆元を仮定しているとかそんな感じやない?しらんけど
数学ではよくあるけど、仮定が大事 それを無視するから、結論を間違えるのはよくある
貴方が間違えたかどうかは知らんど
写像の合成で結合則が必ず成り立つのなら、そのような記述はどっかの書籍に必ずある
自分は見たこと無い。あるとすれば、なんらかの仮定で限定されている。
417:デフォルトの名無しさん
20/08/22 01:01:19.51 fPcZe606.net
知らん過ぎ
418:デフォルトの名無しさん
20/08/22 01:40:43.87 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:デフォルトの名無しさん
20/08/22 12:23:17.90 .net
ここ三年以内に発売されたハスケルの本は?
421:デフォルトの名無しさん
20/08/22 13:18:34.82 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:デフォルトの名無しさん
20/08/22 13:19:16.92 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:デフォルトの名無しさん
20/08/22 13:31:18 DGMheHKA.net
それで?
会話や食事の中の唾液飛沫の3次元シミュレーションが出来るんですか?
424:デフォルトの名無しさん
20/08/22 13:35:02 j3K8XBr1.net
>>404
あれ、これ今日コンパイルしたらエラーが出た。
単にコンパイルしていなくて、ghciで用意されている(.)を使ってテストしていただけみたいです。
以下の合成関数のコードはおそらく正しいと思います。
comp :: (b -> c) -> (a -> b) -> a -> c
comp = \f -> \g -> (\x -> f (g x))
425:デフォルトの名無しさん
20/08/22 13:36:18.12 j3K8XBr1.net
圏論入門 Haskellで計算する具体例から (日本語) 単行本 ? 2020/8/19
雪田 修一 (著)
この超人気の本を読んだ人いますか?
426:デフォルトの名無しさん
20/08/22 13:41:29.64 j3K8XBr1.net
>>419
この関数の書き方を一度書いたら、
func a b = …
みたいな書き方は気持ち悪くて嫌になりますね。
427:デフォルトの名無しさん
20/08/22 13:45:41.47 j3K8XBr1.net
すごいHaskell、やっと5章まで読み終わりました。
この辺りから難しくなりますか?
428:デフォルトの名無しさん
20/08/22 21:29:49.29 YtG8IJDk.net
難易度竹。
429:デフォルトの名無しさん
20/08/22 21:45:32.55 j3K8XBr1.net
すごいHaskellの6章を読んでいますが、いきなり難しくなりました。
find :: (a -> Bool) -> [a] -> Maybe a
のMaybe aというのは探している要素が見つからなかった場合に返されるNothingが属するような型を用意したかったからですか?
430:デフォルトの名無しさん
20/08/22 21:46:48.62 j3K8XBr1.net
もしそうだとして、質問なんですが、Nothingはあらゆる型に属すると約束すればいいだけの話ではないんですか?
431:デフォルトの名無しさん
20/08/23 07:53:38.79 m55Vd3Cb.net
「null安全」でググれ
かつて、あらゆる型に属するnullを導入していた言語が、
nullのない型を別途導入する方向に動いている
432:デフォルトの名無しさん
20/08/23 10:09:34 ts+Zp8he.net
ヌルポはどこにバグがあるかを教えてくれるが、
ボトポにはそれさえない。
``` code
bottom :: a
bottom = bottom
dangerous_find :: (a -> Bool) -> [a] -> a
dangerous_find _ [] = bottom
dangerous_find pred (a : as) = if pred a then a else dangerous_find pred as
```
ただ役に立たないというだけでなく、
危険なほど役に立たない関数も作りたければ作れる。
433:デフォルトの名無しさん
20/08/23 11:59:38.54 PT3WAMjf.net
>>405
これ、左結合が出来ないからじゃない
考え方としては左結合はありなんだろうけど、
実質無いということ
f.g.h x で左結合やろうとしても、
関数適用と合成の優先順位で関数適用の方が優先される
結果として右結合にしかならない。
434:デフォルトの名無しさん
20/08/23 12:29:03 hbFjgy0U.net
学術の巨大掲示板群 - アルファ・ラボ URLリンク(x0000.net)<)
435:デフォルトの名無しさん
20/08/23 13:32:54.91 41ZiKAKU.net
>>428
「関数合成は、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
だったら、違和感がないんですが、
「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
には違和感を感じます。
一度にたくさんの関数を合成できる理由が関数合成が右結合だからというのはやはりおかしいと思います。
436:デフォルトの名無しさん
20/08/23 13:36:29.73 41ZiKAKU.net
Function composition is right-associative, so we can compose many functions at a time.
The expression f (g (z x)) is equivalent to (f . g . z) x.
これが原文です。翻訳がおかしいわけではないようですね。
437:デフォルトの名無しさん
20/08/23 13:53:55.24 PT3WAMjf.net
関数適用を合成より優先順位上げる条件のもと
合成を左結合でλ式に落とし込こんでみればいいんじゃない
出来るのなら俺の間違い 出来ないのなら
左結合では合成が出来ないのだから、文章も間違ってない
と思っただけ
438:デフォルトの名無しさん
20/08/23 16:12:09.03 ZATaa76b.net
>>430
確かに俺も疑問に思ってた
結局何が言いたいんだ?ってなってそのまま放置してたわ
439:デフォルトの名無しさん
20/08/23 16:16:46.30 41ZiKAKU.net
>>426
ありがとうございました。検索してみようと思います。
>>427
ちょっと何を言っているのか分かりませんでした。
440:デフォルトの名無しさん
20/08/23 23:06:04.74 ts+Zp8he.net
ごめん、関係ないと書いておくべきだった。
今後は、自分の投稿は全て無視して欲しい。
誰かの質問に答えているつもりはなくて、
プログラミングのネタを拾っているだけ。
ついでなので、前回のペーストビンにアップしたネタについて書く。
まず、タプル、状態、継続以外の随伴はちゃんとしていない。
アウェイの圏をちゃんと書こうとすると泣きが入る。Haskellは集合の圏では
超強力だが、それ以外の圏に対しては並になる。中は見てないが、
[species](URLリンク(hackage.haskell.org))では、
圏をほぼフルスクラッチで作っているんじゃないかと思う。
で、コードにする段階でウソをついているのだが、素直にウソをつけば、
上手く行くことがあるということがあそこで得た教訓。
あそこに書いたモナドでパラメーター対象を2つ持つモナドは全て`R p (L p a)`
という形をしているが、コードでは型宣言を省略しているので、結局、
非対角成分を含めた`R p (L q a)`という形の関手についてのKleisli合成が
得られている。それがレンズが出てきた理由の一つ。
書いたときは知らなかったのだが、非対角成分を含めた関手を
[インデックスモナド](URLリンク(stackoverflow.com))
というらしい。パラメーター対象をもつ随伴からKleisli合成を計算すれば、
自然とインデックスモナドになってしまう。ただし、圏論プロパーに
インデックスモナドと言っても通じないと思う。Haskellでの専門用語だと思う。
441:デフォルトの名無しさん
20/08/25 10:01:02.60 d4SFWo3v.net
Data.Mapについて質問です。
キーがOrd型でないといけないという制約があります。
これは、Mapの実装でキーのデータ構造がハッシュではなく、2分探索木のようなものだからでしょうか?
442:デフォルトの名無しさん
20/08/25 18:47:32.02 NgJQjBWI.net
>>436 ドキュメントにそれっぽいことが書いてあるけど
URLリンク(hackage.haskell.org)
> The implementation of Map is based on size balanced binary trees (or trees of bounded balance) as described by:
> If you don't care about ordering, consider use Data.HashMap.Strict from the unordered-containers package instead.
443:デフォルトの名無しさん
20/08/25 20:49:35.22 d4SFWo3v.net
>>437
ありがとうございました。
444:デフォルトの名無しさん
20/08/27 10:07:06.62 TufIdPw/.net
Jupyter NotebookでHaskell使うならこれ
環境構築の手間が省けるのでおすすめ
Chromebook、iPad、Windows 10 Sモードなどで使えるかは知らない
URLリンク(mybinder.org)
IHaskell
URLリンク(github.com)
> You can now try IHaskell directly in your browser at CoCalc or mybinder.org.
Alternatively, watch a talk and demo showing off IHaskell features.
445:デフォルトの名無しさん
20/08/27 11:10:22.56 sFui1x5L.net
やっぱ最近新しい言語勉強するときはjupyter note book重宝する
446:デフォルトの名無しさん
20/08/28 11:44:03.31 8bIwySwM.net
ついにメンテのされてないgladeが最新のghcじゃビルドできなくなった
シコシコGUI作るの面倒くさくて意気消沈
447:デフォルトの名無しさん
20/08/28 12:26:16.24 5nZNKLNm.net
はすけらはjs嫌いだろうけど(偏見)elmかpurescriptなら使えるだろ
448:デフォルトの名無しさん
20/08/28 12:57:36.50 lCzdfIoX.net
デスクトップGUIアプリの大半はWebブラウザアプリで代替できる。
これを機に、一度こだわりを捨ててみるのも良いかも。
449:デフォルトの名無しさん
20/08/28 13:05:48.93 LLs1s+XQ.net
Webブラウザアプリの大半はデスクトップGUIアプリの方が使い易い。
450:デフォルトの名無しさん
20/08/28 14:56:59.18 5nZNKLNm.net
だよな。はすけらならpurescriptでelectronだよ。
451:デフォルトの名無しさん
20/08/28 15:48:19.78 jEdLmLEr.net
pureselectか
452:デフォルトの名無しさん
20/08/28 16:04:05 .net
書いて三日以内のコードをビルドしました
453:デフォルトの名無しさん
20/08/30 11:24:16 uCpf8zkM.net
質問です
次のプログラムが走りません
Ratio Integer型の割算です
mainの最後の行を受け付けてくれません
import Data.Ratio
import Data.Complex
(///) (x:+y) (z:+w) = let
d = z^2 + w^2
in ((x*z-y*w)/d):+((x*w+y*z)/d)
x :: Ratio Integer
x = 1%1
y = 3%1
z = 2%1
w = 4%3
main = do
print $ (x:+y) /// (z:+w)
print $ x / (z^2+w^2)
print $ (x:+y) /// ((z:+w) + (x:+y))
454:デフォルトの名無しさん
20/08/30 11:24:49 uCpf8zkM.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:23:25: error:
• No instance for (RealFloat (Ratio Integer))
arising from a use of ‘+’
• In the second argument of ‘(///)’, namely ‘((z :+ w) + (x :+ y))’
In the second argument of ‘($)’, namely
‘(x :+ y) /// ((z :+ w) + (x :+ y))’
In a stmt of a 'do' block:
print $ (x :+ y) /// ((z :+ w) + (x :+ y))
|
23 | print $ (x:+y) /// ((z:+w) + (x:+y))
| ^^^^^^^^^^^^^^^
455:デフォルトの名無しさん
20/08/30 11:27:13 uCpf8zkM.net
あ、11行目は
in ((x*z-y*w)/d):+((-x*w+y*z)/d)
でした
でも同じエラーメッセージ出てきます
何故でしょう?
456:デフォルトの名無しさん
20/08/30 14:19:38.49 ubwYKL6u.net
>>448
自己レスです
もしかしてこの型制限ですかね?
RealFloat a => Num (Complex a)
Complex a型がNumクラスに入れるのはaがRealFloat型の時しかダメだからでしょうか?
この制限はなんでこんなにキツイんだろ
足したり引いたりしたいだけなのに
457:デフォルトの名無しさん
20/08/30 15:28:05 0W5gc2Gs.net
>>451
自作のComplexクラスをNum型クラスのインスタンスにしてみようとすると気づくんだけど
Numってなぜかabs関数を実装しないといけないんだよね
それで複素数の妥当な絶対値関数を書くにはsqrtが必要だけど
Numだと計算できないので…という理屈のはず
Haskellの標準の数値型に対する不満はちょくちょく見かけるけど
歴史的経緯もあって現状はしょうがないということになってるはず
458:デフォルトの名無しさん
20/08/30 15:32:06 mGp/4vHZ.net
>>451
URLリンク(downloads.haskell.org)
でData.ComplexのソースコードでNumクラスのインスタンス定義を見たところ
メソッドabsとsignumの実装に
magnitude :: (RealFloat a) => Complex a -> a
を使ってるからみたいだね
本当に足したり引いたりしたいだけならNum制約は強すぎる
数のクラス体系の問題点について詳しくは
URLリンク(blog.miz-ar.info)
459:デフォルトの名無しさん
20/08/30 17:39:55.49 z5he+9Sw.net
>>452
>>453
ありがとうございます
まぁabsが必須ならしょうがないですね
なんか考えます
460:デフォルトの名無しさん
20/08/31 00:20:32.36 XlY0VH6O.net
Complex RationalにNumのinstance宣言できないかと思って以下のようにしてみました
instance Num (Complex Rational) where
(x:+y) + (x':+y') = (x+x') :+ (y+y')
(x:+y) - (x':+y') = (x-x') :+ (y-y')
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
negate (x:+y) = negate x :+ negate y
abs z = undefined
signum z@(x:+y) = undefined
fromInteger n = fromInteger n :+ 0
結果以下のようにそれは無理と怒られます
何かてはないでしようか?
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:7:10: error:
• Illegal instance declaration for ‘Num (Complex Rational)’
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use FlexibleInstances if you want to disable this.)
• In the instance declaration for ‘Num (Complex Rational)’
|
7 | instance Num (Complex Rational) where
| ^^^^^^^^^^^^^^^^^^^^^^
461:デフォルトの名無しさん
20/08/31 11:01:46.76 rDcCtqL6.net
知らんけどコンパイラの言う通りFlexibleInstances使ったら?
462:デフォルトの名無しさん
20/08/31 13:16:55.43 m1GQ7XMv.net
意味も分からずコンパイラの指示に従ってばかりいても、
初心者の域は抜けられない
でも、コンパイルできなきゃモチベーションが下がるから、
取りあえず従っとけ
463:デフォルトの名無しさん
20/08/31 17:00:23.04 .net
でた!おまじない!
464:デフォルトの名無しさん
20/08/31 17:10:43.28 rDcCtqL6.net
標準のhaskellだと
instance 型クラス 型構築子
instance 型クラス (型構築子 型変数1)
instance 型クラス (型構築子 型変数1 型変数2)
…
って形式のインスタンス宣言にしか対応してないからな
instance 型クラス (型構築子 型構築子)
って書きたいなら言語拡張使えって言われる
言語拡張使うか、あるいは、もっと一般的なインスタンス宣言
instance Num a => Num (Rational a)
とかにしたら?
465:デフォルトの名無しさん
20/08/31 18:26:13.20 mkAi3PX1.net
皆さんご助言ありがとうございます
実は家のパソコン壊れててHaskellはオンラインHaskellコンパイラというので当座を凌いでるんですがコレコンパイラオプションもインラインプラグマ?とかいうのも使えないっぽくてFlexible Instanceとか使いたくても使えないんです
Num Rationalは標準で入ってます
入れられなくて困ってるのはNum (Complex Rational)なんです
Num a=>Num (Complex a)
は二重定義でダメだと怒られます
prog.hs:55:12: error:
Duplicate instance declarations:
instance Num a => Num (Complex a) -- Defined at prog.hs:55:12
instance RealFloat a => Num (Complex a)
-- Defined in ‘Data.Complex’
|
55 | instance Num a => Num (Complex a) where
| ^^^^^^^^^^^^^^^^^^^^^^^^
466:デフォルトの名無しさん
20/08/31 18:28:35.47 mkAi3PX1.net
しょうがないのでとりあえずComplex Rationalを“カプセル化”してみました
複素座標0,3,4i,7/2+7/2iである4点が同一円周上にあるか確認するプログラムです
同じ事をComplex Floatとかでやると丸め誤差で誤判定してくれます
できるんですがちょっと不愉快ですね
467:デフォルトの名無しさん
20/08/31 18:28:47.62 mkAi3PX1.net
import Data.Ratio
import Data.Complex
data ComplexRational = CR (Complex Rational) deriving (Show,Eq)
instance Num (ComplexRational) where
(CR (x:+y)) + (CR (x':+y')) = CR $ (x+x') :+ (y+y')
(CR (x:+y)) * (CR (x':+y'))
= CR $ (x*x'-y*y') :+ (x*y'+y*x')
negate (CR (x:+y)) = CR $ negate x :+ negate y
abs = undefined
signum = undefined
fromInteger n = CR $ fromInteger n :+ 0
instance Fractional (ComplexRational) where
recip (CR (x:+y))= CR $ (x/(x^2+y^2)):+(-y/(x^2+y^2))
toComplex (CR x) = x
i = CR $ 0:+1
onCircle a b c d = (==0) $ imagPart $ toComplex $ ((a-c)/(b-c))/((a-d)/(b-d))
a=0
b=3
c=4*i
d=7/2+7/2*i
main = do
print $(1/2+3/4*i)/(5/6+7/8*i)
print $ onCircle a b c d
-----
CR (618 % 841 :+ 108 % 841)
True
468:デフォルトの名無しさん
20/09/03 16:35:31.39 VDk3Uebh.net
すごいHaskell、7章を読んでいますが、正直、重要ではあるが面白くない内容なので読むペースが遅くなってしまっています。
最後まで読み切ろうと思います。
469:デフォルトの名無しさん
20/09/03 16:55:07.23 VDk3Uebh.net
図書館にリクエストした以下の本を買ってもらうことができて、明日、借りられることになりました。
楽しみです。
圏論入門 Haskellで計算する具体例から
雪田 修一 (著)
470:デフォルトの名無しさん
20/09/04 20:26:41.82 zDdu0cA6.net
雪田著『圏論入門』を借りてきました。
圏論、難しい上につまらないです。
471:デフォルトの名無しさん
20/09/04 20:35:32.88 4VK1Z/Kj.net
何を期待して借りたのやら
472:デフォルトの名無しさん
20/09/04 21:42:59 W/y0jTmz.net
圏論はモナドへの近道
473:デフォルトの名無しさん
20/09/05 02:01:31.05 hzZ7uEzq.net
>>460
です
自己レスです
色々調べて一応Complex RationalにNumのinstance入れる方法見つけました
しかしかなり裏技というか、あまり関心しない方法かもしれません
やはり正攻法は>>462のようにカプセル化する方だと思いますけど、せっかく見つけたのでうpします
>>462と同じく0,3,4i,7/2+7/2iが同一円周上にあるか確認するプログラムです
ついでにabsも使えるようにしてあります
absがいらないならsqrt=の部分がなくても動作します
474:デフォルトの名無しさん
20/09/05 02:03:13.00 hzZ7uEzq.net
import Data.Ratio
import Data.Complex
instance (Integral a)=> Floating (Ratio a) where
sqrt = fromRational.toRational.sqrt
.fromRational.toRational
instance (Integral a) => RealFloat (Ratio a) where
floatDigits = floatDigits.fromRational.toRational
decodeFloat = decodeFloat.fromRational.toRational
scaleFloat k x = if k > 0 then x*2^k else x/2^(-k)
475:デフォルトの名無しさん
20/09/05 02:03:23.39 hzZ7uEzq.net
i = 0:+1%1
onCircle a b c d = id
$ (==0)
$ imagPart
$ ((a-c)/(b-c))/((a-d)/(b-d))
(a,b,c,d)=(0,3,4*i,7/2+7/2*i)
main = do
print $(1/2+3/4*i)/(5/6+7/8*i)
print $ onCircle a b c d
print $ ((a-c)/(b-c))/((a-d)/(b-d))
print $ abs $ 2+3*i
print $ abs $ 15+8*i
----
618 % 841 :+ 108 % 841
True
4 % 7 :+ 0 % 1
8118979690322419 % 2251799813685248 :+ 0 % 1
17 % 1 :+ 0 % 1
476:デフォルトの名無しさん
20/09/05 13:15:04.05 T3msgi7J.net
純粋に興味のみからすごいHaskellを読んでいるのですが、みなさんはなぜHaskellを使っているのですか?
477:デフォルトの名無しさん
20/09/05 13:35:41.51 EwmIpy36.net
宣言的に書けた時の気持ち良さがたまらんから
478:デフォルトの名無しさん
20/09/05 14:03:13.58 T3msgi7J.net
>>472
やはり実用よりは趣味ということですね。
479:デフォルトの名無しさん
20/09/05 14:05:39.74 14+GNjHV.net
Haskellで書かれた実用的なアプリ無いからな。
480:デフォルトの名無しさん
20/09/05 17:37:30.47 acNOQ2m1.net
『Haskellによる関数プログラミングの思考法』って出たの3年前なのに書籍版はもう絶版なんだな
旧版を元にした『関数プログラミング入門』の方はまだ売ってるけど
481:デフォルトの名無しさん
20/09/05 18:22:32.54 r4XBIbpb.net
3年で消えてもらった方が新しい商品が売れるという実用的思考
永久保存など消費者の趣味だ
482:デフォルトの名無しさん
20/09/05 18:33:16.32 mscSzbua.net
>>474
pandoc は?
483:デフォルトの名無しさん
20/09/06 01:05:18.13 lOdtO6cj.net
>>474
Elmコンパイラは?
PureScriptコンパイラは?
spagoは?
484:デフォルトの名無しさん
20/09/06 01:51:45.47 Z433FiXx.net
HaskellっていうかParsecが優秀なんだろな
485:デフォルトの名無しさん
20/09/06 22:23:29.89 YBPAq9+r.net
>>471
パーサーを書く必要があって使い始めた
486:デフォルトの名無しさん
20/09/07 11:55:03.70 xmFuETjj.net
純粋に興味からです
487:デフォルトの名無しさん
20/09/07 17:09:40 6+huFxV7.net
>>467
マクレーンの圏論とか読んでも果てしなく遠回りするだけだぞ。
488:デフォルトの名無しさん
20/09/07 17:57:43 kXMphwO9.net
>>482
ベーシック圏論はどうですか?
489:デフォルトの名無しさん
20/09/07 18:10:28 oaoIrH3d.net
haskellのモナド理解するだけなら圏論いらないからね
ベーシック圏論は内容を限定して敷居の低い例を使っているので相対的には
読みやすいけど、基礎的な数学の知識がないと例が理解の助けにならないのは同じ
490:デフォルトの名無しさん
20/09/07 20:28:07.77 xmFuETjj.net
関手って圏が持つ「対象と射」同志の関連付けのことだよね?
なぜfmap関数を定義すると関手を実装したことになるの?
491:デフォルトの名無しさん
20/09/07 21:15:30.28 3sLeGs6G.net
fmapという名前が変
関手は射と見なせる
492:デフォルトの名無しさん
20/09/08 01:49:12.47 L2ZCtfX62
副業、大手も制度着々…コロナ禍、働き手は空き時間活用
URLリンク(www.itmedia.co.jp)
富士通「年収3500万円」の衝撃 ソニー、NECも戦々恐々の「グローバル採用競争」
URLリンク(www.itmedia.co.jp)
東大の起業ラッシュは本物か、大学発ベンチャー数日本一の実力
URLリンク(business.nikkei.com)
AI研究の第一人者、東大・松尾研でも起業ラッシュ
URLリンク(business.nikkei.com)
失敗は認める、多数決はダメ。拡大する「社会起業家集団」の作り方
URLリンク(newswitch.jp)
新卒“即”起業せよ。社会起業家への最短距離に挑む若者たち
URLリンク(newswitch.jp)
人々の共感を得られないと潰される時代。
URLリンク(news.yahoo.co.jp)
ゼロから起業するよりも事業承継(小さな会社の買収)が圧倒的に有利である3つの理由
URLリンク(honsuki.jp)
「エース人材だって起業OK」、NECは挑戦者が集う場をつくる
URLリンク(business.nikkei.com)
NECなど「出向起業」 大企業人材、起業しやすく
URLリンク(www.nikkei.com)
493:デフォルトの名無しさん
20/09/08 01:52:19.60 L2ZCtfX62
70億円調達のネットショップ作成サービスhey、「我の弱い人同士の組織力」武器にEC市場シェア拡大目指す
URLリンク(www.businessinsider.jp)
【劇団ノーミーツ1】役者も客も会わないオンライン演劇で7000人動員。制作チームは全員20代、半分は会社員
URLリンク(www.businessinsider.jp)
「ガーナのゴミ」がなぜ1点500万円の作品に変わるのか
URLリンク(www.businessinsider.jp)
利用、無料。日本版衛星データプラットフォーム「Tellus」がすごい理由…“宇宙の視点”でビジネスはこう変わる
URLリンク(www.businessinsider.jp)
「起業ブーム」が新たなフェーズに 大学発ベンチャーへの想い
URLリンク(forbesjapan.com)
かつて学者がやっていたことを、今は起業家がやっている
URLリンク(diamond.jp)
番号やアドレス不要の無料通話アプリRe-mo登場 ドワンゴが配信開始
URLリンク(japanese.engadget.com)
494:デフォルトの名無しさん
20/09/09 09:53:26.80 TuvEFz+K.net
勝俣「シャー!」
495:デフォルトの名無しさん
20/09/09 10:39:29.87 o85d1us6.net
圏の圏な
496:デフォルトの名無しさん
20/09/09 11:37:10.69 sfIbn56V.net
圏論いらずで、モナド理解するのにどうすりゃいいの?
497:デフォルトの名無しさん
20/09/09 12:18:16.37 /Y+BdKRx.net
do記法が使えるようになる
モナド=>モナド則を満たす=>do記法はモナド則の別バージョン
結局のところ、モナドはdo記法を作りたかった。よって、先頭の話になる。
498:デフォルトの名無しさん
20/09/09 12:43:31.80 /Y+BdKRx.net
ちょっと嘘だな
488は既にあるモナドを使う場合の話で
自分でモナドを作ってみたいのなら
モナド則を満たしていることの確認が必要
ってことで、モナド則の勉強も必要
個人的にモナドが一番分かり易かったのは、↓かな
サルでもわかるIOモナド①-③
URLリンク(hot-heart-cool-mind.seesaa.net)
499:デフォルトの名無しさん
20/09/09 12:59:11.96 7PwBIIdR.net
モナドというのが何なのか知らないのですが、モナドが何か分かっていないとモナドは使えないものなんですか?
500:デフォルトの名無しさん
20/09/09 13:33:56.84 Ss6OMKhc.net
Haskellで出てくる演算子の読み方一覧ってないですか?
501:デフォルトの名無しさん
20/09/09 18:46:46.75 7PwBIIdR.net
>>494
それともHaskellという言語は何でもかんでもある数学的に説明できるように設計されていて気持ちがいいというだけのことでしょうか?
502:デフォルトの名無しさん
20/09/09 18:50:44.11 N/YnHGom.net
低学歴の数学弱いなのに、頑張ってHaskellで開発の会社に潜り込んで仕事してる人も居るから。
503:デフォルトの名無しさん
20/09/09 19:41:50.73 YuHH3QPI.net
高卒のワイでもプロのHaskellerになれるん?
その方法教えて欲しいわ。
504:デフォルトの名無しさん
20/09/09 19:44:40.13 7PwBIIdR.net
仕事でHaskellを使っている会社があるのですか?
実用面でのHaskellの利点があるということですか?
505:デフォルトの名無しさん
20/09/09 19:58:00.07 7PwBIIdR.net
「Haskellの美しさを知っている人は、人生に絶望することはない。Haskellで世界を変えたい。」などと表紙に書かれているHaskellの本が
ありますが、そんな大げさなものでしょうか?
単なる一プログラミング言語ではないんですか?
506:デフォルトの名無しさん
20/09/09 20:15:19.85 +oYkcMI9.net
型システムが強力ってだけで実用上有利
現実、型がしょぼい言語よりバグ減るし、
型から関数探せるから既存プログラムの再利用性高いし、
ウェイがノリで作る「イケてる」オレオレライブラリなんかにも型の合うある程度まともな設計が求められるし
507:デフォルトの名無しさん
20/09/09 20:16:27.76 YuHH3QPI.net
それは持てる者がほざく絵空事やでw
508:デフォルトの名無しさん
20/09/09 20:56:40 /Y+BdKRx.net
んじゃ、async/awaitがモナドで実装できるんやでー
詳細はしらんけどw
509:デフォルトの名無しさん
20/09/09 22:27:03 M9aZojkl.net
IDEは何がおすすめ?
510:デフォルトの名無しさん
20/09/10 02:20:35 6Lrmk0HC.net
らっきょ
511:デフォルトの名無しさん
20/09/10 08:33:57.45 OHVt/ux7.net
俺も聞きたいけどVScodeじゃ辛い?
512:デフォルトの名無しさん
20/09/10 13:10:19.99 he9lsIhb.net
>>500
理解した途端にこんなしょー�
513:烽ネいことでドやってたのかと絶望するよ。
514:デフォルトの名無しさん
20/09/11 22:58:53.84 dNbZ7rGGn
デキる人ほどフリーランス化する?★働き方改革
URLリンク(www.youtube.com)
年収890万円以下は社会のお荷物★騙される労働者
URLリンク(www.youtube.com)
騙されたくなかったら勉強しろ★他人のルールは損をする
URLリンク(www.youtube.com)
底辺の99%は一生底辺★10年後が見えない同僚たち
URLリンク(www.youtube.com)
稼ぎたければ働くな★4千万円ぽっちも稼げないのはなぜ?
URLリンク(www.youtube.com)
サラリーマン思考では儲からない理由
URLリンク(www.youtube.com)
で、無職は稼いでるの?★YouTube収益はアホにも分かりやすい
URLリンク(www.youtube.com)
515:デフォルトの名無しさん
20/09/12 10:38:44.00 A2+hHxph.net
[分数モナド](URLリンク(ncatlab.org))
日常生活でも目にする`2 / 3`のような分数表記はモナドになっている。
吸収元の問題があるので、ネタとしては引き算`2 - 3`の方が扱いやすいが、
引き算の場合、`2 - 3 = - 1`のように計算してしまった結果が使われ、
日常生活では生々しいモナド表記はあまり使われない。その点、分数では、
直積からのコンストラクターをもろに使った漢な表現が
日常生活の中で使われている。
分数は、モナドを使うことと、モナドを理解することは別腹という
良い例になっている気がする。分数がモナドになっていることが生きてくるのは、
システムがそれなりに複雑になってからじゃないかと思う。抽象化には
コストがかかるので、そのコストに見合った見返りが必要になるが、
システムが簡単だと、抽象化のコストをペイできない。
分数モナドは有名な例なので、何処かのブログで紹介されていると思うが、
見たことがないので、書いてみた。ホームが可換モノイドの圏なので、
オレオレモナドになってしまうが、モナド則の`QuickCheck`はできるので、
圏論の練習になるかもしれない。
516:デフォルトの名無しさん
20/09/12 20:26:45.44 TbuoUVLB.net
は?何言ってんの
517:デフォルトの名無しさん
20/09/13 08:12:50.88 Tso/1gLY.net
ひ?何言ってんの
518:デフォルトの名無しさん
20/09/13 14:14:05.81 7XfXIlf2.net
>>509
return と >>= は何になるんですか?
519:デフォルトの名無しさん
20/09/13 15:14:54.14 Gippd8g0.net
しらないけど
return x = x / x
ぐらいしか定義できなさそう
520:デフォルトの名無しさん
20/09/13 21:12:53.92 Tso/1gLY.net
ふ?何言ってんの
可換モノイドの圏は集合の圏の
[部分圏](URLリンク(ncatlab.org))だが、
集合の圏ではない。したがって、分数モナドは、
Haskellの`Monad`のインスタンスにならない。
例えば、次のような実装を考えると、
``` code
newtype Bunsu a = Bunsu {
runBunsu :: (a, a)
} deriving (Show, Functor)
instance (Eq a, Semigroup a) => Eq (Bunsu a) where ...
instance (Semigroup a) => Semigroup (Bunsu a) where ...
instance (Monoid a) => Monoid (Bunsu a) where ...
instance (Monoid a) => Group (Bunsu a) where ...
bunsu_pure :: (Monoid a) => a -> Bunsu a
bunsu_pure = ...
```
縛り`Monoid a`が邪魔をして、`Bunsu`は`Applicative`のインスタンスに
できない。それでも、通常の関数の形でなら`bunsu_pure`と`bunsu_join`は
書けるので、モナド則のチェックはできる。ただし、`Bunsu`は、
可換モノイドの圏でのモナド則は満たすが、集合の圏でのモナド則は満たさない。
質問への直接の答えは避けるが、可換モノイドの圏で考えないと
答えは得られない。
521:デフォルトの名無しさん
20/09/13 23:57:07.12 Tso/1gLY.net
へ?何言ってんの
もしかすると、何言ってんのが前の投稿にかかっちゃったかもしれない。
何も考えずに、何言ってんのおじさんプレイを楽しんでいるだけなので、
気にしないでほしい。
ついでなので。
`return x = x / x`という選択は、集合の圏では、取りうる唯一の選択肢かも
しれない。自分も他に思いつかない。しかし、可換モノイドの圏では、
他にも選択肢がある。それも含めて、
[記事](URLリンク(ncatlab.org))
に全て書いてある。他人事なので断言してしまうが、この記事より詳しい
分数モナドの解説は地球上には存在しない。しかし、悲しいかな、
Haskellの解説記事と同じで、
* わかる人にはわかるが、
* わからん人にはなるほどわからん
といういつものパターンになっていると思う。解説案件の宿命かもね。
522:デフォルトの名無しさん
20/09/14 02:32:09.85 TxRaIMAU.net
>>=は何ですか?
523:デフォルトの名無しさん
20/09/14 02:44:47.64 SnB9iMGf.net
圏論わからんからなんもわからん
524:デフォルトの名無しさん
20/09/14 16:41:03.56 TxRaIMAU.net
Monad という概念が数学の圏論の Monad から来るのはよく解説が見つかるんですが、Applicative (≒Monoidal) については数学からの意味付けが見つかりません
コレ数学的にはなんなんですか?
525:デフォルトの名無しさん
20/09/14 23:29:35.74 XfiH3m4/.net
そのままじゃん アプリカティブファンクター
なんだから、そのまま日本語訳でよくね
つまり、関手 プログラマーにとって使いやすくしただけ
ところで、”Applicative (≒Monoidal)”なのか?
こっちの方がい意味不明なんだが
モノイドって意味なら、≒モナド の方
モナイド則=モノイド則 モナドの方は、自己関手って条件が付くだけ
しらんけど
526:デフォルトの名無しさん
20/09/15 00:17:11.21 wUKRYY2O.net
>>519
まだ自分でハッキリ確かめたわけじゃないんですけど
Applicative と Monoidal は同型なんだそうです
URLリンク(qiita.com)
まだこっちはどういう意味で“同型”になるのかわかってませんけど
数学的な意味でのMonadは英語のwikiに詳しく説明が載ってて↓
URLリンク(en.m.wikipedia.org)(category_theory)
このFormal DefinitionがまさにHaskellのモナド則に繋がっていくのは確かめました
問題はApplicativeは圏論のどの概念に該当するのかの説明がサッパリ見つからないんです
527:デフォルトの名無しさん
20/09/15 02:19:25.61 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:デフォルトの名無しさん
20/09/15 10:15:51.98 TeSbfrM9.net
>>521
そう、Haskellの圏論がらみの話はその“冪対象”(exponential object)が絡むのがややこしい
しかしFunctorは当然としてMonadも冪対象を用いないで形式化されてる(というより計算論の世界への応用のずっと以前からある)
Applicative(=Monoid?)はどやねんという話なんです
圏論の世界ではなかったものが計算論の世界に導入されてから考え出されたもんなんですかねぇ?
529:デフォルトの名無しさん
20/09/16 01:31:29.62 yuR5T5xB.net
strong lax monoical functor
530:デフォルトの名無しさん
20/09/16 22:12:52.40 CfmtxJKj.net
モノイド圏とかモノイド対象とかあんのだけど、モノイド(モノイダル)関手ってのもあんのね
読む気は無いんだけど、アプリカティブ関手とモノイダルXXが同型ってのは無いと思うが
っておもったけど、関手同士なんだから、いくつか条件つければモナドとモノイドみたいな関係もありうるんかな?
あとは、カン拡張、随伴、普遍性(極限だっけ?) どれかから相互に変換出来るだっけ?みたいなもん?
どちらにしろ、定義の話で面白みは無いとは思うのだが
531:デフォルトの名無しさん
20/09/17 10:32:26.07 2a8IoKJu.net
見つけた
URLリンク(qiita.com)
このサイトの人がまとめたpdfに書いてある
とは言ってもやはりclosed categoryは仮定してる
やっぱりapplicativeはmonadと違って“内部ホム”を持たない圏では定義できないんだろな
“内部ホム”もつ圏でmonoidal functorに<*>を定義するのはわりと簡単だけど↓
F(X) × F(Y^X)
→F(X×Y^X) (coherence)
→F(Y) (F(eval))
URLリンク(en.m.wikipedia.org)
pureが全然できんなぁと思ってたら“strong”という条件からpureが作れるんだな
まぁHaskellて圏の話するときはHASKて言えればいいんだからコレでわかったことにしよ
532:デフォルトの名無しさん
20/09/28 01:41:48.03 0EuZ+v5t.net
[Promise](URLリンク(developer.mozilla.org))
の小さい例題の[html](URLリンク(pastebin.com))をアップした。
async/awaitはPromiseのお助け文法になっているが、それは扱っていない。実行環境は、
[RStudio](URLリンク(rstudio.com))から
[Node.js](URLリンク(nodejs.org))を呼び出している。
533:デフォルトの名無しさん
20/10/12 16:08:54.17 Wx/lfAmjI
挑戦する馬鹿として生きるか?批判だけする雑魚として死ぬか?
URLリンク(www.youtube.com)
奴隷職に就く★自ら奴隷を選んで不満を言う愚かさ
URLリンク(www.youtube.com)
バカは騙され最低賃金でコキ使われる★物価とか関係なし
URLリンク(www.youtube.com)
勉強しないから奴隷人生★実業と人を残す人生哲学
URLリンク(www.youtube.com)
正社員特権が「ブラック社員」を生む★正社員は訴え放題
URLリンク(www.youtube.com)
「で、年収は?」と聞くバカとは合わない社長業
URLリンク(www.youtube.com)
534:デフォルトの名無しさん
20/10/14 04:31:41.26 +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:デフォルトの名無しさん
20/10/31 09:11:59.11 UJYxitvT.net
URLリンク(walk.northcol.org)
>代数的データ型(algebraic data type)とは,図のように木構造で表現される値からなるデータ型のことです.
必ず木構造に限定されるんだろうか?
OOPではオブジェクトグラフがありネットワークになりうるが、
Haskellでは絶対に木と考えて良いの?
536:デフォルトの名無しさん
20/10/31 12:29:50.75 cEs7BAmA.net
いいんじゃない?
型の全体は文脈自由文法で規定されるクラスだから木になる希ガス
537:デフォルトの名無しさん
20/10/31 12:34:33.57 fxcwqRC2.net
この木なんの木きのこる木
538:デフォルトの名無しさん
20/10/31 12:37:07.03 CAmth+XY.net
見たこともない木ですから
独自実装のバグが出るでしょう
539:デフォルトの名無しさん
20/10/31 13:17:41.17 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:デフォルトの名無しさん
20/10/31 13:26:01.44 UJYxitvT.net
再帰的なデータ型はグラフにできるのでは?
541:デフォルトの名無しさん
20/10/31 13:37:30.03 B0ELcd4k.net
最終的に暴走しないで展開が停止するものだけをデータ型と呼ぶならそうだけど、iterate (+4) 5 ですら無限の木になってしまう
542:デフォルトの名無しさん
20/10/31 21:13:27.13 3k5Im+3l.net
haskellの配列は代数的データ型でばないのか?
543:デフォルトの名無しさん
20/10/31 22:07:18.29 XiPKdEPZ.net
foldrなどの引数のことを代数的と言っていたような気がする
引数は(:)と[]でもいいし
(+)と0でもいい
引数を渡すと関数 [a] -> b が返ってくるが
これは関数というよりOOPの継承関係のような印象
544:デフォルトの名無しさん
20/10/31 22:34:53.43 B0ELcd4k.net
Haskell のデータ型は再帰を許すからな
どうしても「終端記号(大文字から始まるData constructet) を木構造に並べたもの」という説明をしたいなら無限グラフを使わざるをえない
545:デフォルトの名無しさん
20/11/01 07:14:51.56 fIYIMdhR.net
URLリンク(walk.northcol.org)
1)foldr (+) 0 [1, 2, 3]
(+)とカッコがつく理由は?
2)map' f = foldr (\x a -> f x : a) []
xは[]の各要素?aは何?
546:デフォルトの名無しさん
20/11/01 08:58:44.92 Srz4hpJo.net
1)
URLリンク(walk.northcol.org)
2)
このままだと対応する値が存在しないので、少し書き換える
map' f xs = foldr (\x a -> f x : a) [] xs
xはxsの各要素、aは最後の要素では[]で、
それ以前は後ろの要素に(\x a -> f x : a)を適用した結果
547:デフォルトの名無しさん
20/11/01 09:15:58.91 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:デフォルトの名無しさん
20/11/01 10:14:49.54 1eMkmBeN.net
因数?引数ではなく?
Haskell用語なのかな
549:デフォルトの名無しさん
20/11/01 10:21:30.53 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:デフォルトの名無しさん
20/11/01 10:25:40.23 Srz4hpJo.net
おっと、具体例の「foldr (\x a -> f x : a) [1,2,3]」は
「foldr (\x a -> f x : a) [] [1,2,3]」の誤り
551:デフォルトの名無しさん
20/11/01 10:36:13.55 B/d//mYI.net
い・・・引数
552:デフォルトの名無しさん
20/11/01 10:54:46.55 z/eHKN3/.net
引数です
orz
普段“因数”の方が使う人なのでうっかりしたorz
553:デフォルトの名無しさん
20/11/01 11:03:53.67 93fSMn/e.net
こ・・・因数
554:デフォルトの名無しさん
20/11/01 11:05:28.12 z/eHKN3/.net
こ?
555:デフォルトの名無しさん
20/11/01 11:11:25.51 4+fLUvoM.net
だ…因数
556:デフォルトの名無しさん
20/11/01 12:57:34.37 9/8GaKcH.net
ひきすう
557:デフォルトの名無しさん
20/11/01 15:22:11.82 N8AW169o.net
引数を「ひきすう」と読むのは、同音異義語との混同を避けるための慣用読みだと思ってた
化学(ばけがく)、鼻腔(びくう)みたいな
558:デフォルトの名無しさん
20/11/01 15:24:45.41 BdB3gM+x.net
返り血
559:デフォルトの名無しさん
20/11/01 17:34:03.38 S9fsJ+JS.net
Parameterとargumentsの違いがよくわからない
560:デフォルトの名無しさん
20/11/01 17:44:50.76 5aO2zs3I.net
URLリンク(qiita.com)
だってよ
561:デフォルトの名無しさん
20/11/01 17:59:46.68 S9fsJ+JS.net
よくわからんし一緒ってことか
562:デフォルトの名無しさん
20/11/02 00:43:34.64 TnMF05Pn.net
質問です
このサイトでNum instanceをDerivingする話が出てました
URLリンク(qiita.com)
実際このページの次のコードはうちの環境でも通ります
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:デフォルトの名無しさん
20/11/02 00:43:43.72 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:デフォルトの名無しさん
20/11/02 21:44:04.17 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:デフォルトの名無しさん
20/11/02 23:56:16.57 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:デフォルトの名無しさん
20/11/03 01:59:40.73 WdkpFDBO.net
わざわざNumのインスタンスにしなくても、これでいいのでは
makeP = fmap sum . mapM ( fmap length . manyTill anyChar . char )
567:デフォルトの名無しさん
20/11/03 10:26:04.44 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:デフォルトの名無しさん
20/11/03 11:32:34.46 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:デフォルトの名無しさん
20/11/03 11:50:57.17 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:デフォルトの名無しさん
20/11/03 18:12:46.66 oSP8TPsC.net
この話の面白いところは
Parser Intという型を宣言する言語と
そもそも型を宣言しない言語
どっちが生産性高いかってことだよ
571:!id:ignore
20/11/06 20:16:57.19 uZSEyxFl.net
stackくんさぁ、コンパイラのダウンロードが200MB強あるんだから、低速回線は途中で切断されるとかよくありそうなことじゃん
サスペンド・レジューム機能搭載は必須じゃないのかね
きょうびyoutube-dlでさえ向こうに切断Forbiddenされても今までダウンロードした分は残ってて、再度ダウンロードを開始した際には途中から残りの部分をダウンロードすように始まるってのにさ
仮に205.86 MiB / 205.87 MiBまで来て切断された場合
リトライすると0 MiB / 205.87 MiB からだなんてお互い不幸になると思わないのか?
こっちは成功するまで永遠に繰り返すんだぞ? むしろそっちの方がそちらにとっても迷惑じゃん
それとも低速回線は死ねっていう差別的思想を持っているのかね?
572:デフォルトの名無しさん
20/11/08 11:31:57.94 Bx8aZf2L.net
一方TeXはisoイメージを使った
573:デフォルトの名無しさん
20/11/08 13:05:47.79 .net
パターンガードの変数の束縛は局所的なのですが、全ての場合で共通して使用してほしい束縛はどうやりますか?
574:デフォルトの名無しさん
20/11/09 01:15:49.21 4MQyK7K1.net
>>567
質問の意味がよく分からないのだが、コード例を出せる?
こんな風に書けたらいいのに、みたいな。
575:デフォルトの名無しさん
20/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:デフォルトの名無しさん
20/11/09 19:58:42.43 .net
おっと無用な改行が一々入っちゃった。。。
577:デフォルトの名無しさん
20/11/09 20:20:48.18 UhW/CkjO.net
>>569-570
where で出来なかったっけ?だめだったかな?
578:デフォルトの名無しさん
20/11/09 21:00:20.89 .net
あ、できました。
お騒がせしました(////)
579:デフォルトの名無しさん
20/11/11 19:20:13.76 qheOKxfd.net
正格評価について質問です
ひとつの引数しかない関数 f を正格評価するときには
f $! x
でよいようですが2引数の場合はどうするんですか?
( f $! x ) $! y
で x, y を先に展開してくれますか?
良さげなんですがどう確かめたものやら
なんか正格評価と遅延評価で格段に計算量が変わる f の例ってありますか?
580:デフォルトの名無しさん
20/11/11 21:38:04.29 TR1bVb0l.net
遅延評価がなくてもGCはメモリ解放を遅らせている
GCをいじるにはIOが必要
$!を使うのにも少なくともモナドが必要と考えるのが自然なのでは?
x' <- return $! x
y' <- return $! y
return $! (f x' y')
581:デフォルトの名無しさん
20/11/11 22:07:05.86 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:デフォルトの名無しさん
20/11/12 14:57:12.09 +Y5HOlnE.net
正格評価と遅延評価で計算量が変わるといえばtaraiじゃね?
583:デフォルトの名無しさん
20/11/12 23:16:18.57 G64JuFLE.net
⊥になるものでいいじゃん
584:デフォルトの名無しさん
20/11/13 06:27:56.29 ewlhvLCU.net
trace や unsafePerformIO で評価順を調べられないかな
585:デフォルトの名無しさん
20/11/13 12:04:46.50 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:デフォルトの名無しさん
20/11/16 23:33:39.07 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:デフォルトの名無しさん
20/11/18 01:05:30.21 VzwFaHaO.net
>>580
イヤ、まだ奮闘中です
おぉ、そんな便利なものが
使ってみます
588:デフォルトの名無しさん
20/11/21 23:31:14.57 ak7brOTq.net
Haskellはライブラリの中身を覗くと
Template Haskellを駆使した
グッチャグチャの実質別言語みたいなコードがザラなのがなぁ・・・
水面下の白鳥状態じゃねーか
589:デフォルトの名無しさん
20/11/22 16:59:26.57 gt3QNmmg.net
ゴミライブラリ使うのやめて良いやつ作って公開してくれ
590:デフォルトの名無しさん
20/11/22 17:19:45.03 MRtbpg3I.net
在学中か学校出たての経験浅い奴しか担い手がいないのだろうからそんなもんなんだろう
純粋関数型言語は学生がかかるはしかみたいなもので
やがて計算機科学の現状に絶望し去ってゆく
現在のコンピューターは手続き型に最適化されているのだ
591:デフォルトの名無しさん
20/11/22 18:37:00.71 36XuvgN2.net
単純に関数型言語がわかる人が少なすぎるからじゃないの?
592:デフォルトの名無しさん
20/11/22 20:14:41.06 .net
居飛車党と振り飛車党の闘いは続く
593:デフォルトの名無しさん
20/11/22 23:16:18.31 b60g3zenS
みずほが週休3日・4日を導入、副業もオッケーに!ただし給料は80%、60%に下がるが、あなたならどうする?
URLリンク(www.excite.co.jp)
みずほFG 週休3~4日制導入へ 新型コロナで働き方見直し
URLリンク(www3.nhk.or.jp)
副業OK時代!初心者に人気の副業を試してみて…メリット・デメリットとは
URLリンク(news.yahoo.co.jp)
「労働時間の見直し」に先鞭をつけた みずほフィナンシャルグループ
URLリンク(blogos.com)
給料ダウンの危機を副業でカバーしたい…副業している人はどんな仕事でいくら稼いでいるの?
URLリンク(news.yahoo.co.jp)
副業を会社に報告しない理由TOP3、3位会社が禁止している、2位告知されていない、1位は?
URLリンク(dime.jp)
副業年収1億超のmotoさんに聞いた!「本業」で成果を上げて自分の市場価値を高める方法
URLリンク(ddnavi.com)
フリーランス向け報酬即日払いサービス『先払い』が大規模リニューアルし正式リリース
URLリンク(prtimes.jp)
国内最?級!副業・フリーランスエンジニアに特化した、仕事探しの求?アプリ
『doocyJob(ドーシージョブ)』、iOS版アプリを2020年10月6日(?)リリース
URLリンク(prtimes.jp)