関数型プログラミング言語Haskell Part32

■ このスレッドは過去ログ倉庫に格納されています
2019/01/29(火) 09:05:47.90ID:gJP/u7IJ
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ
https://haskell.jp/

前スレ
関数型プログラミング言語Haskell Part31
https://mevius.5ch.net/test/read.cgi/tech/1506447188/
319デフォルトの名無しさん
垢版 |
2019/05/01(水) 13:42:48.29ID:gsz88y7w
まぁこの手の選択にある程度以上責任持って助言するのは難しいんだよな。
少なくとも両方使ってないとどっちがいいとか言えないし。
ほとんどの人が最初に使った方をそのまま使い続けるもんじゃね。
私もcabalしかつかったことないし。
2019/05/01(水) 14:03:02.54ID:01/czEVZ
「みんなの見解を聞く」も自分で情報を得る過程のひとつだと思ってるんだが

記名ネットではしにくい無責任方言もここなら言えるでしょ
2019/05/01(水) 14:23:04.11ID:01/czEVZ
まだキチンと検討していないが、自作したツールをbrewとかで公開するとき、ビルドツールを依存に含める必要が出てくると思う。予めどっちかを使うかは決めておきたい。
バージョンを重ねるなかでフラフラ変えるのは避けたい。

あとcabalだとコンパイラを替えるときはghcupなる別ツールを使うの? これだとクロスコンパイラはどうなる。
複数のアーキテクチャのための成果物をビルドするとき、ghcup set ... && cabal build && ghcup set ... && cabal build ... みたいにいちいち指定しないといけないのかしら。
コレを解決するにはghcupにパッチを当てるかcabalを改造するか、スクリプトを書くかするわけだ。その点 stack build はコマンド一発なのに。

俺は年間50時間くらいstackのパッチや関連ツールを書いてきた。このままで行けるならいいが、stack がいずれオワコンになるなら早めに見切りつけて時間節約したい。
新元号が30年続くなら令和中に1500時間も浪費することになるんだぜ。
2019/05/01(水) 14:53:10.97ID:ALj9hUB7
>>320
> 記名ネットではしにくい無責任方言もここなら言えるでしょ

そんなレスは情報ではないのでは?
ただのノイズでしょ(ノイズの全てがゴミとは言わないが)。
本当に情報を得たいのなら、時間の無駄だよ。

もし、そんなのを参考にどっちか決められるのなら、
初めからルーレットで決めるのと大して変わらないのでは?

「自分で情報を得る」の第一歩は、ビルドツールで一番何がしたいかを決めて、
それが出来るか、やりやすいかを「公式ドキュメント」を見て調べる事だよ。

stackとcabalの公式ドキュメントを見て比較して、
それでも分からない部分をピンポイントでSNSや掲示板などで質問する、
それが二歩目だと思う。
323デフォルトの名無しさん
垢版 |
2019/05/01(水) 16:46:41.64ID:fQT4rWd7
伸びてると思ったら。。。
今の所stackかな。
cabalは依存関係で過去に評判悪かったから、新しいのの評判が固まったらかな。
2019/05/02(木) 10:15:34.23ID:PPz8MGJz
>>322
調査を並行してやっちゃいけない理由はないでしょ。聞くだけならタダやし。
スレ民の意見をノイズだなんて思ったことないよ。自分にない視点や個人的使用感、気づきにくい落とし穴を教えてもらえるかも。

俺の雑感はstackは不備だけでなくバグも多かった気がする。.stack-workを消したらビルドが直ったみたいなことが何回かあったと思う。

stackのメリットは、
(ghcupの方針が変わらないなら)コンパイラの導入まで自動でやってくれるので、例えばHaskellスクリプトを書いてシェバンにstack、
以降に依存ライブラリを書いておけばいつでもどこでも動く(HackageとStackageが活きてるかぎり)、必要なものを都度自動で用意してくれる。

stackのデメリットは、
設定ファイルが多すぎる。プロジェクトレベルでは stack.yaml, package.yaml, Hoobar.cabal
と、どれに何を書くかが判りづらい、いちいち引っかかる。
2019/05/02(木) 12:34:35.03ID:WAiWu/DB
>>324
無責任放言がノイズなんだよ。

で、その全てがゴミとは言わないとも言ってる。
2019/05/02(木) 13:13:18.93ID:PPz8MGJz
>>325 前半は反論したし、後半は批判してないですよ。
2019/05/03(金) 01:40:50.69ID:nJ30PKpf
凄いH本の中国語版見る機会があって、
漢字の用法がカタカナ語より
しっくりすると思ったんですけどどうでしょうか。

模式:  パターン
門衛:  ガード
類型類: 型クラス

さすがにモナドは漢字翻訳難しいみたいですが。
2019/05/03(金) 06:21:38.43ID:hYhvNKlL
その程度のカタカナがしっくり来なかった人生を反省するんだ
2019/05/03(金) 09:01:46.98ID:gvxbExu1
慣れとしっくりくるのは別物だけどな
無意味刺激と有意味刺激、表音文字と表意文字に対する認知は先天性の個人差があるんだからあまり他人の人生なんて分かりもしないものに言及するべきではない

どちらにせよ今の中国は学術用語を積極的に訳する文化ではあるよね
Haskellに限らずclassや他の用語もそれに類した漢字が用いられてそう
ただこれも漢字の意味が時代によって変化してくると正しい用語認識を阻害しうるのは現代日本でいくらか見られているし、一長一短と個人差だね
2019/05/03(金) 10:47:01.08ID:4xTnxfhe
かつてアルゴリズムを算法とかコンパイルを翻訳とか
一部で言っていましたね。

モナドアクションを算法と訳すならモナドは法かぁ
などと連想してみました。
2019/05/03(金) 11:01:45.26ID:aPBgVjEU
漢字に訳する場合どっか権威のあるところが決める必要があるよね
そういうところがめんどくさい
2019/05/03(金) 12:09:36.96ID:4xTnxfhe
大陸だと結構あちこちで勝手に翻訳されたり
輸入されていずれ収斂されていくっていう
感じだった。

日本でも官公庁の訳語が定着しないことも
多いよね。
333デフォルトの名無しさん
垢版 |
2019/05/03(金) 12:40:40.57ID:eVcW5sZJ
流れも読まずminからmaxまでのランダムな数のリスト(要素数n)を得る関数作って見た。

takerand _ _ xs 0 = return xs
takerand mn mx xs n = do
x <- randomRIO (mn, mx)
takerand mn mx (x:xs) (n - 1)

使い方は

rs <- takerand 1 6 [] 10

これで1ー6までのランダムな数が10個入ったリストが手に入る。
334デフォルトの名無しさん
垢版 |
2019/05/03(金) 12:41:50.16ID:eVcW5sZJ
流れも読まずminからmaxまでのランダムな数のリスト(要素数n)を得る関数作って見た。

takerand _ _ xs 0 = return xs
takerand mn mx xs n = do
x <- randomRIO (mn, mx)
takerand mn mx (x:xs) (n - 1)

使い方は

rs <- takerand 1 6 [] 10

これで1ー6までのランダムな数が10個入ったリストが手に入る。
2019/05/03(金) 14:37:49.43ID:af96C5Xg
>>334
それなら、getStdGen と randomRs と take でいいのでは?

takerand mn mx n = getStdGen >>= return . take n . randomRs (mn, mx)
あるいは
takerand mn mx n = take n . randomRs (mn, mx) <$> getStdGen
2019/05/03(金) 14:52:14.89ID:af96C5Xg
>>335
いいのでは、と言うのは失礼な言い方だった。

こういう方法もあるよ、と言うことで。
337デフォルトの名無しさん
垢版 |
2019/05/04(土) 06:36:55.99ID:S+NYX3By
>>335
そう言うのがあったのね。。。
thanks.
2019/05/04(土) 09:34:13.31ID:6lRHaHYp
Arrowised FRP を 矢矧のFRP とかいうのは好き
2019/05/04(土) 09:36:30.32ID:6lRHaHYp
型クラスの訳語 類型類 は、kindの 類 とごっちゃになるな、と思ったけど、
kindは 種 が主流なのか
2019/05/04(土) 17:11:10.97ID:MNo33vgu
>>339
主流というか、それ以外に聞いたことがない
2019/05/04(土) 18:12:27.03ID:6lRHaHYp
>>340
初期の訳語では類だったかも?
https://www.sampou.org/haskell/tutorial-j/classes.html
2019/05/06(月) 16:30:54.25ID:gerN8CWz
すみませんHaskellでアート芸術方面のプログラミングをしたい場合
既存の表示用ライブラリは導入からして難しそうな印象があるので
表示はProcessingに任せるという方法を考えていますが、

http://hackage.haskell.org/package/processing-for-haskell

もしそういう方面に詳しい人がいましたら
それについての助言を頂きたいです。
2019/05/06(月) 16:46:03.96ID:jvaKyQ4h
>>342
なにを助言してほしいのか具体的に明確に言ってくれ。
344デフォルトの名無しさん
垢版 |
2019/05/06(月) 21:07:46.31ID:gerN8CWz
>>343
説明が不十分ですみません。
アート芸術のプログラミングを行う場合
表示は既存ライブラリは使わずに

Haskell-Processing連携ライブラリを使って
データ処理と表示を切り分けた方が
簡単なのではないだろうかという質問でした。

https://github.com/anton-k/processing-for-haskell/blob/master/tutorial/QuickStartForProcessingers.md

表示はProcessingで行います。
2019/05/06(月) 23:14:35.12ID:jvaKyQ4h
>>344
データ処理と表示処理を切り分けた方が開発が楽になるのはその通り。

でも、グラフィックス ライブラリに何を使うかと、
楽に切り分けできるかどうかは、一般には関係ない。
特に haskell のグラフィックス ライブラリはたいてい EDSL 形式になっているから、
どれを使おうが、切り分けの楽さは大して変わらない。

後はもうライブラリの表現力が求めるレベルにあるかどうかと、
個人の経験や慣れ、趣味の問題だ。
Processing に慣れているなら processing-for-haskell でいいだろう。
個人的には gross が好き。


ところで、既存のライブラリって何だ?
processing-for-haskell は 2016 年でアップデートが止まってるが、
これは既存ではないの?
346sage
垢版 |
2019/05/06(月) 23:44:49.55ID:gerN8CWz
>>345
ありがとうございます。理解しました。

参考にしたのが School of Expression だったので
情報が古くprocessing-for-haskellが
最新の物と思えて勘違いしてました。
2019/05/07(火) 14:46:19.40ID:A4BDuZrS
diagrams を使ってた。
2019/05/08(水) 18:25:39.72ID:Sfv9Blmq
>>344
そういうことをしたいならProcessingだけでやった方が手間かからない
Haskellで書けば楽になるとかそんなことは一切ないので
2019/05/08(水) 22:03:23.22ID:Et3ZqY/0
>>348
「haskellで」アート芸術方面のプログラミングをするには、という質問だと思う。

ジェネラティブアートなんか haskell にもってこいじゃないかな。
もちろん、Processing の得意分野でもあるんだが、
宣言的に書ける haskell もけっこうマッチするのでは?
全て型プログラミングで生成とかもできそう。
2019/05/12(日) 15:06:12.68ID:11og9P/f
f xs = let g = \x -> 2 * x in map g xs

この場合、ラムダは最初に一回メモリにアロケートされて g に束縛されるよね。

でも、もしかして、

f xs = map (\x -> 2 * x) xs

これって、f が呼ばれる度に map の第一引数のコード(ラムダ)がメモリにアロケートされるの?
2019/05/12(日) 21:06:22.80ID:yBh745ei
クロージャにしなくてもいいラムダはただの関数として扱われるんじゃない?
というか上のコードならセーフっていうのはgを使いまわしてくれるから?
そんな気の利いた処理系なら下のラムダも使いまわしてくれそうだけど
352デフォルトの名無しさん
垢版 |
2019/05/12(日) 21:12:09.17ID:x0KgamNa
その辺り、実際にどんな実行コードが生成されるかに関しては、
コンパイラ(GHC)に聞いてくれ、としか言いようがない
インライン展開とかクロージャ変換といったコンパイラ技法を学ぶことを勧める
関数型言語だからTiger本とか
2019/05/13(月) 01:00:48.68ID:Jw01/DTu
ラムダは何も簡約しなくても最初からWHNFじゃないのか
最初からWHNFならサンクとか不要だから普通の言語と同じでいい
2019/05/13(月) 23:41:36.79ID:kVO0yWqO
>>350
ラムダ式が動的に生成されるものと思っているのなら間違い
この場合は単なる関数として展開されている
2019/05/14(火) 19:41:06.85ID:B2OD/x5C
なるほど、納得できた。
これからは安心して引数にラムダを直接書ける。
ありがとう。
2019/05/23(木) 06:24:49.40ID:Jx74KNT2
mtl によるモナド合成はモナド則を保存しない

マジかよ失望しました。mtl は窓から投げ捨てます
357デフォルトの名無しさん
垢版 |
2019/05/23(木) 17:37:28.82ID:4B/apNfB
動的型付けに比べて静的型付けの方が優れている、は常に真?

実はHaskellで動的プログラミングをやる話を読んで、
あれっコレ意外といいじゃんと思ってしまったんだ。
2019/05/23(木) 18:42:06.90ID:ATxGBnNk
次にお前らは『優れているを定義してくれ』と言うッ!
2019/05/24(金) 01:05:05.82ID:jCONIFNW
任意の言語に丸投げするシェルスクリプトはズル
文字列をevalするやつもズル
ズルをする必要がない言語は優れている
どうせこんな感じだろうと思ってる
2019/05/24(金) 04:51:31.33ID:3xUJmLCM
いくつかの基準が思いつく。
速い・短い・アシストが手厚い・理解しやすい・バグが混入しにくい…

>>359
「ズル」には悪い、の意味が予め含まれていると思うので納得できない。
evalを用いた場合に比べて静的型の解決の方が優れているのを示す必要があるでしょう。
2019/05/24(金) 08:28:17.80ID:jCONIFNW
格闘技ですら、反則には反則負けという意味が含まれている
2019/05/24(金) 09:32:47.08ID:3xUJmLCM
含まれてないと思うし、Haskellに関係ない。
363デフォルトの名無しさん
垢版 |
2019/05/24(金) 11:18:44.54ID:YDCPM0sO
sequence_の使い所が分からん。。。
mapM_使った方が短くなるし。

うーむ。。。
渡すリストにIOな関数含められる=IOな関数を使う
リスト内包表記も使えるのは良いけど、mapM_のが簡潔。

import Data.List
import System

main = mapM_ put $ zip hellos marks
-- sequence_ [put (x,y) | (x,y) <- zip hellos marks]

hellos = (cycle.tails) "Hello World!!"

marks = cycle ["/","|","\\","--"]

put (x,y) = do putStrLn (x ++ "\n" ++ y)
mapM_ (\_ -> putStr "") [1..50000]
system "clear"
364デフォルトの名無しさん
垢版 |
2019/05/24(金) 11:19:15.22ID:YDCPM0sO
hellos = (cycle.tails) "Hello World!!"

marks = cycle ["/","|","\\","--"]

put (x,y) = do putStrLn (x ++ "\n" ++ y)
mapM_ (\_ -> putStr "") [1..50000]
system "clear"
2019/05/24(金) 14:25:55.92ID:3xUJmLCM
>>363
モナディックアクションを構造に入れて使うとき重宝するよ。
main = sequence_ . (map (putStr "log:" >>)) $ [print "hoo",putStr "bar"]
個々のアクションを好きに調整できる(例ではそれぞれに前処理を足した)。
366デフォルトの名無しさん
垢版 |
2019/05/24(金) 18:49:41.11ID:aewo4dFz
>>365
ありがとう。
いつか役立てたいものです。
367デフォルトの名無しさん
垢版 |
2019/05/24(金) 18:55:43.73ID:aewo4dFz
別件なのですが、俺俺Eq型クラス(MyEq)を作って見ているのですが、
HugsだとNum a型のインスタンスを作れるのに、GHCだとエラーが出ます。

経験ある方、いらっしゃいますでしょうか?

main = do print $ 1 === 1
print $ 1 /== 1
print $ 1 === 2
print $ 1 /== 2

class MyEq a where
(===),(/==) :: a -> a -> Bool

x === y = not (x /== y)
x /== y = not (x === y)

instance (Num a) => MyEq a where
x === x' = isZero (x - x')
x /== x' = not (x === x')

isZero 0 = True
isZero _ = False

GHCだと全ての型をインスタンスにしろ的なエラーメッセージが出ます。。。
スマートな方法があれば。。。
2019/05/24(金) 20:57:13.04ID:SgRJwbG9
>>363
mapじゃなくunfoldrで[IO a]を作ってもいい

>>367
エラーは「インスタンスにする型はこれこれこういう形にしろ」って意味
instance (Num a) => MyEq a みたいな形を許すと
instance (MyEq a) => Num a とかもできて意味わからなくなるから
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
というおまじないを使って制約を取っ払う
2019/05/25(土) 02:52:58.92ID:qv11a0DJ
>>357
オブジェクトファースト動的解決脳だとHaskellはただめんどくさいだけの言語にしか見えない
利点とされていることが欠点にしか見えないもある
2019/05/25(土) 04:10:17.12ID:/RQqfD4m
>>369 具体的にはどのあたりが?
2019/05/25(土) 06:07:15.41ID:/RQqfD4m
"--port=" <> ( 8000 <> 80 )
これが "--port=8080" になって欲しい、みたいな?
2019/05/25(土) 12:55:48.15ID:1pSM7n1N
>>371
それは暗黙の型キャストとかの話な気もするが
String と Num a との積を勝手に解決するなよって思う
2019/05/25(土) 14:00:56.82ID:/RQqfD4m
>>372
https://github.com/chrisdone/dynamic
ではどちらのリテラルも直ちにDynamic型に落ちます。
2019/05/25(土) 14:25:22.48ID:/RQqfD4m
...でも演算子を上述のように定義すると半群の結合則を満たさない。
dynamicパッケージでもそうされてなくて、結果は"--port=800080"になります。

動的プログラミングを求める人は柔軟に使える演算が欲しくて、
Haskellのデフォルトの定義は型変換がただ面倒くさい。
369が言いたかったのは例えばそういう事かなと解釈しました。
375デフォルトの名無しさん
垢版 |
2019/05/25(土) 17:32:54.76ID:nXhWU27U
>>368
おまじない!!
ありがとうございます。
これで行けそうですm(_ _)m
2019/05/25(土) 20:46:23.64ID:orcduCKk
何やってるのかよく分からんけど、おまじないで解決

haskellの初心者時代って、こういうの他言語に比べて多いよね
どうにか分かりやすく説明できないものか、いつも悩む
2019/05/25(土) 21:58:16.52ID:1pSM7n1N
>>374
まあ確かに数値計算するときにfromIntegralだのrealToFracだのをゴテゴテ書くのは
(それを要求される理屈はわかっていても)面倒くさい
そこを「柔軟」にしていくと人が書き間違えたときに教えてくれなくなるから
結局は書きやすさと安全性とのトレードオフだよなあ
2019/05/31(金) 20:49:17.15ID:SYuh0ZxQ
結局、マクロ、関数、型チェック以外にプログラムにできることなんてない。
バカがバカな夢を見る。
2019/05/31(金) 20:53:47.48ID:4BnNLuhc
それを証明してから言えよバカ
2019/06/02(日) 11:37:55.39ID:mVf2k3qD
Cは関数の定義はゴテゴテ書くが演算子の定義は何も書かなかった
C++が演算子を定義するようになったからHaskellも影響を受けたんじゃないか
数学的証明だけでなく、歴史を巻き添えにして議論しないと現実は見えない
2019/06/07(金) 00:15:16.82ID:pdU7zkZH
すみません、
凄いH書籍で学習していて疑問に思ったのですが
型クラス中級で、真理値の様な物を持ちうる型、
JavaScriptのfalsyな値を持つ型を作る実習で
Intや[ ]を独自のYesNo型のインスタンスにする
例があったのですが
標準で存在する型に後から
独自の型のインスタンスにする事に違和感を感じ
バグの温床になるのではという懸念の印象がありました。


オブジェクト嗜好のサブクラスみたいに
「Int」型から「IntYesNo」型を
生成できるのなら違和感ないのですが。

これについての合理性と安全性を明示している
書籍やサイトを知っていたら教えて下さい。
2019/06/07(金) 00:45:34.97ID:UZbkEtL+
>>381
温床とまで言うか・・・

そのせいで例えばどんなバグがありそうか、
ひとつでも例を示すことはできる?
ごく簡単な例でいいんだが。
2019/06/07(金) 01:35:51.00ID:UZbkEtL+
>>381
あと、なんど読み返してもタイポっぽく見えないんでツッコミ入れる。
「AをBのインスタンスにする」と言うとき、
Aは型、Bは『型クラス』だからな。

失礼なことを言うが、もしかして違和感の根源は、
型と型クラスがそれぞれ何なのか理解できていないところにあるのでは?
2019/06/07(金) 06:58:43.76ID:m7qCH6wP
    『凄いH書籍』

(;・`д・́)...ゴクリ...(`・д́・;)
385デフォルトの名無しさん
垢版 |
2019/06/07(金) 19:56:02.21ID:SUVJWRIg
同モジュール(Haskellでいう)内なら拡張に対しては責任を持つべきなので
拡張がモジュールをまたがないなら大した問題はない
他の言語でもモジュール内操作に対してはあんまりフールプルーフじゃないしね

がHaskellの場合は拡張が子モジュールに伝播してしまう
2019/06/07(金) 22:06:13.49ID:wtNNzOUb
Ruby の偽は、false, nil の2つだけ!

JavaScript, Python, PHP などは、偽が10個ぐらいある!

空文字列・空配列・空辞書とか、0, 0.0 とか、
これらの言語は、しょーもないバグが多い!

だから、Rubyよりも生産性が低い!
2019/06/07(金) 23:58:36.77ID:KFSm+TLI
『入門HASKELLプログラミング』2019年07月31日発売予定
https://www.shoeisha.co.jp/book/detail/9784798158662

「コンピュータのプログラミング」から脱却し、“学術”ではない、実用度重視のHaskell
入門書

Haskellは、関数型プログラミングを研究する対象としての側面が強すぎ、一般的なアプリ
ケーション構築を目的とした開発言語の側面が、ともすればおざなりになりがちでした。
そのため、他の言語(JavaとかC/C++とかC#など)がこなす、ありふれたアプリケーション
をHaskellで構築しようとすると、キーボードを叩く指が止まってしまうことがありました。
本書は関数型プログラミングの基本を押さえつつ、いわゆる「開発言語」として実用的な
プログラムを書けるようなレベルに誘う一冊です。(後略)
388デフォルトの名無しさん
垢版 |
2019/06/08(土) 01:49:15.40ID:WG0iLGtf
>>386
rupy死んだのになんで生きてるの?ww
とっとと後を追いなよwwww
2019/06/08(土) 03:07:04.34ID:PPvh7BCd
Pythonのfalsyな値には、そんなに違和感はないけどなぁ……。
390デフォルトの名無しさん
垢版 |
2019/06/08(土) 03:44:53.76ID:epil0e3i
391デフォルトの名無しさん
垢版 |
2019/06/08(土) 03:45:50.56ID:C8CdREmC
【実体験】ブログを1,000記事ほど書いたら、月300万くらい稼げた話
https://www.youtube.com/watch?v=GmVulh282ps&;t=604s
【報告】ブログで「月収1,000万」を達成できました【方法を解説する】
https://www.youtube.com/watch?v=pgjcuLp8wt0
年間ほど努力したら「年収3,000万」になったので、経験談を語る
https://www.youtube.com/watch?v=oV_SY-a1lMs
期間工ブログの収入は1500万円でした。【フリーランスの現実&底辺からの復活編】
https://www.youtube.com/watch?v=aijLjFLOuC4
年商1300万のプロブロガーの初心者時代から今までの軌跡
https://www.youtube.com/watch?v=UMiF4T2EO9o
【収益報告】実働月10hでも大金稼ぐ方法を解説【年収6,000万】
https://www.youtube.com/watch?v=o2ISWP-VZsw&;t=288s
無料ブログは稼げない。稼ぐならオススメはWordPress一択の理由
https://www.youtube.com/watch?v=o8oUe3JS-lg
2019/06/08(土) 06:33:44.76ID:YhBKasle
get programming with haskellは、stackがでてくるの終盤だったり、
あまり実用度重視じゃないんだけどなー
393デフォルトの名無しさん
垢版 |
2019/06/08(土) 10:04:10.25ID:ryWt2Gls
>>389
Ture + True
みたいなのはエラーにしてくれたら良いのにとは思う
2019/06/08(土) 13:03:38.36ID:JxaHk6L1
そんなコードが生じるシチュエーションがわからん。
395381
垢版 |
2019/06/08(土) 17:21:52.39ID:mlZK/xCe
ありがとうございます。
既存の型を独自の型クラスの
インスタンスにする事は
同モジュール内の拡張として
プログラムする人が責任を持つべきなので
問題はないとの事で了解しました。

急いで質問を書いたので
型クラスを型と間違って書いてしまいすみませんでした。
396デフォルトの名無しさん
垢版 |
2019/06/18(火) 06:17:55.21ID:3nOE2mBA
プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/

142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
2019/06/20(木) 01:44:21.27ID:R55GIdRS
functoriality とはどのような性質のことでしょうか?
2019/06/20(木) 04:43:35.94ID:R55GIdRS
>>397
補足しますと、functorial は分かります。
ですが、functoriality がいったい何に対してどのような意味で使う言葉なのか分かりません。

Hask圏を例にしてくれると助かります。
399デフォルトの名無しさん
垢版 |
2019/06/27(木) 19:51:11.76ID:xcUkqEUS
>>398
Functorであること
Haskellで言えば、Type -> Type なカインドを持つ型コンストラクタがFunctorのインスタンスであって、Functor則を満たすこと
2019/07/01(月) 09:45:16.04ID:PP1UmLnE
ラズパイでStackの環境構築をしていざコンパイルをしてみたら

・llvmは6.0のみサポートだよ
・一応コンパイルしてみるよ

というメッセージが出た後,

・サポートされていない機械語を使ってるよ

ということでコンパイルが通らなかった。

llvmを6.0のソースからmakeすればいいのかな?

Stackやllvmはすべてapt-getで最新版にしてあります。
401デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:38:59.85ID:/x+NnqQg
officialのrepositoryと最新版(binary)は違うよ
402デフォルトの名無しさん
垢版 |
2019/07/02(火) 12:46:31.20ID:+JGifkmy
hackageのcabal-installのbootstrap.shをクリックしても
Page not found: Sorry, it's just not here.
とでてダウンロードできないのだが?
403デフォルトの名無しさん
垢版 |
2019/07/02(火) 16:08:25.14ID:+JGifkmy
まあいいやtar.gzに入ってるからな
2019/07/02(火) 20:25:51.99ID:2+AqqNZH
>>401
レスありがとうございます。
公式の最新版とaptリポジトリでの最新版は違うということは認識してます。

やっぱり llvm 6 のソースを公式サイトからおとして make install ですかね?
405デフォルトの名無しさん
垢版 |
2019/07/11(木) 15:19:40.91ID:EO8VLz8P
hackageのホームページのダウンロード数が出るところにはcabalとかからダウンロードしたものは
数にふくまれてる?
406400,402
垢版 |
2019/07/20(土) 23:02:04.74ID:flSCEm3M
一応ラズパイ上(raspberian 9.4) でもコンパイルできました。
ただしstack を使わずghcで直接コンパイルですが。

 オプションが渡されていないバグがあったような情報を
見かけましたがこのあたりが原因?
https://gitlab.haskell.org/ghc/ghc/issues/11058
2019/07/24(水) 23:54:43.53ID:/HKiGEdd
3件もこのスレで本の省略系がアレでワロタ
協調させて省略するとこうなる
凄いH楽しく学ぼう
408デフォルトの名無しさん
垢版 |
2019/08/11(日) 16:09:11.67ID:L0OuEHk+
λの数だけ強くなれるよ〜♫
2019/08/12(月) 07:07:43.10ID:8tVc9hN7
最近発売された書籍はどうでしたか
2019/08/12(月) 18:35:53.32ID:EuURpOPT
はい
2019/08/14(水) 23:43:24.45ID:ITFywCVm
この??の部分てどう書いたらいいですか?

f :: a -> IO (Maybe b)
g :: b -> IO (Maybe c)

h :: a -> IO (Maybe c)
h x = do
(y :: Maybe b) <- f a
(z :: Maybe c) <- ??
return z
2019/08/15(木) 00:56:45.05ID:2FISIxPr
もっといいやり方ありそうですが、自己解決しました。
IO (Maybe)から、いったん MaybeT IO に迂回してからMaybe(Maybe c)を潰すんですね、、

import Control.Monad.Trans.Maybe

f :: a -> IO (Maybe b)
f = undefined
g :: b -> IO (Maybe c)
g = undefined

h :: a -> IO (Maybe c)
h x = do
y <- runMaybeT $ (MaybeT $ f x) >>= (\x -> MaybeT $ g x)
let
contractMaybe :: Maybe (Maybe a) -> Maybe a
contractMaybe aa = case aa of
Just (Just x) -> Just x
_ -> Nothing
return $ contractMaybe y
2019/08/15(木) 02:33:07.91ID:9FXQJNeU
Maybeを潰すのは型的に合っていないと思う

data A
data B
data C
f :: A -> IO (Maybe B)
f = undefined
g :: B -> IO (Maybe C)
g = undefined

h :: A -> IO (Maybe C)
h x = runMaybeT $ MaybeT (f x) >>= (\y -> MaybeT (g y))

h' :: A -> IO (Maybe C)
h' = runMaybeT . (MaybeT . f >=> MaybeT . g)
2019/08/15(木) 09:54:21.85ID:2FISIxPr
>>413
ありがとうございます。

data宣言してるA B Cだと確かに型チェック通らないですね。
他にもa b cを具体的にStringにしたらダメでした。
a b cバージョンだと通ってるんですが、何か違いがあるのでしょうか?

また、実際とりかかっていたのは、
fが下のwebViewGetDomDocumentで、
gが下のgetBodyでした。
こちらもMaybeつぶしで型チェックは通っています(挙動はまだ確認していませんが)。

webViewGetDomDocument :: WebView -> IO (Maybe Document)

getBody
:: (DocumentClass self, Control.Monad.IO.Class.MonadIO m) =>
self -> m (Maybe Graphics.UI.Gtk.WebKit.Types.HTMLElement)
2019/08/15(木) 17:40:56.74ID:3wJ+zeP0
h x = do {
y <- f x;
z <- case y of { Nothing -> return Nothing; Just y' -> g y' };
return z
}

なにがMaybe潰しだ
ただの分岐にデザインパターンみたいな名前つけやがって
2019/08/16(金) 13:02:37.84ID:wUgksw8i
わざわざzを経由する必要ある?
2019/08/16(金) 18:54:52.75ID:pXb2X6++
モナド則その2
m >>= return = m
を満たさない半モナド?を想定してる可能性
2019/08/17(土) 01:26:41.61ID:ES53moma
圏論の知識って役に立つの?
2019/08/17(土) 01:42:35.34ID:ToRIVhzM
私は逆をお聞きしたいです
haskell の知識って圏論を理解する助けになりますか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。