5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

関数型プログラミング言語Haskell Part27_©2ch.net

1 :デフォルトの名無しさん 転載ダメ©2ch.net:2015/01/08(木) 21:02:35.67 ID:IQPOX3u7
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part26
http://peace.2ch.net/test/read.cgi/tech/1406436392/

2 :デフォルトの名無しさん 転載ダメ©2ch.net:2015/01/08(木) 21:03:43.02 ID:IQPOX3u7
過去スレ一覧
25) http://peace.2ch.net/test/read.cgi/tech/1393313450/
24) http://toro.2ch.net/test/read.cgi/tech/1382705669/
23) http://toro.2ch.net/test/read.cgi/tech/1376111807/
22) http://toro.2ch.net/test/read.cgi/tech/1364009659/
21) http://toro.2ch.net/test/read.cgi/tech/1358702176/
20) http://toro.2ch.net/test/read.cgi/tech/1350428908/
19) http://toro.2ch.net/test/read.cgi/tech/1340760070/
18) http://toro.2ch.net/test/read.cgi/tech/1331902463/
17) http://toro.2ch.net/test/read.cgi/tech/1325510368/
16) http://toro.2ch.net/test/read.cgi/tech/1317958045/
15) http://hibari.2ch.net/test/read.cgi/tech/1310199414/
14) http://hibari.2ch.net/test/read.cgi/tech/1299385928/
13) http://hibari.2ch.net/test/read.cgi/tech/1286706874/
12) http://hibari.2ch.net/test/read.cgi/tech/1272536128/
11) http://pc12.2ch.net/test/read.cgi/tech/1252382593/
10) http://pc12.2ch.net/test/read.cgi/tech/1231861873/
09) http://pc11.2ch.net/test/read.cgi/tech/1211010089/
08) http://pc11.2ch.net/test/read.cgi/tech/1193743693/
07) http://pc11.2ch.net/test/read.cgi/tech/1174211797/
06) http://pc11.2ch.net/test/read.cgi/tech/1162902266/
05) http://pc8.2ch.net/test/read.cgi/tech/1149263630/
04) http://pc8.2ch.net/test/read.cgi/tech/1140717775/
03) http://pc8.2ch.net/test/read.cgi/tech/1076418993/
02) http://pc2.2ch.net/test/read.cgi/tech/1013846140/
01) http://pc.2ch.net/tech/kako/996/996131288.html

3 :デフォルトの名無しさん 転載ダメ©2ch.net:2015/01/08(木) 21:05:17.88 ID:IQPOX3u7
関連サイト

(英語)
Haskell - Wikibooks, open books for an open world (ページ内に内容をまとめたPDFあり)
http://en.wikibooks.org/wiki/Haskell

Learn You a Haskell for Great Good! (『すごいHaskellたのしく学ぼう!』の無料オンライン版)
http://learnyouahaskell.com/chapters

Real World Haskell (同名書籍の無料オンライン版)
http://book.realworldhaskell.org/read/

(以下、日本語)
Haskell入門 5ステップ - HaskellWiki (公式サイト内、日本語入門セクション)
http://www.haskell.org/haskellwiki/Haskell%E5%85%A5%E9%96%80_5%E3%82%B9%E3%83%86%E3%83%83%E3%83%97

Haskell - Wikibooks (先述Wikibooksの日本語版。未編集の項目、多)
http://ja.wikibooks.org/wiki/Haskell

Programming in Haskell
http://www.sampou.org/cgi-bin/haskell.cgi

Haskell のお勉強
http://www.shido.info/hs/

Haskell Programming
http://www.geocities.jp/m_hiroi/func/haskell.html

本物のプログラマはHaskellを使う:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/

4 :デフォルトの名無しさん 転載ダメ©2ch.net:2015/01/08(木) 21:06:46.46 ID:IQPOX3u7
関連書籍検索一覧 (「米」は米国amazon、主に洋書。「日」は日本amazon、主に和書)

Keyword = "Haskell"
(米) http://www.amazon.com/s/rh=n:283155,n:3839,k:Haskell
(日) http://www.amazon.co.jp/s/rh=n:492352,k:Haskell

Keyword = "functional programing" (米) | "関数 プログラミング" (日)
(米) http://www.amazon.com/s/rh=n:283155,n:3839,k:functional%20programing
(日) http://www.amazon.co.jp/s/rh=n:492352,k:%E9%96%A2%E6%95%B0%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&ie=UTF8

----
テンプレは以上です。

5 :デフォルトの名無しさん:2015/01/09(金) 00:48:19.81 ID:jgy+4bNd
では諸君、議論したまえ

6 :デフォルトの名無しさん:2015/01/09(金) 01:01:59.82 ID:vIp0tEWI
関数型プロぐミング入門買ったぞ
でもpythonの本も買ったからこっちから読みますわ

7 :デフォルトの名無しさん:2015/01/09(金) 02:18:54.18 ID:emL8ycJO
前スレ終わってしまった
これ頼む

 オライリーの表紙がカブトムシなのは何でなんだ?
 perlのラクダ、pythonの蛇のようにマスコット?

8 :デフォルトの名無しさん:2015/01/09(金) 07:41:03.23 ID:ToFRVBIh
スレチな上にスレまたいでまで引っぱるようなネタか。

9 :デフォルトの名無しさん:2015/01/09(金) 16:51:28.96 ID:F3f5qdO+
1おつ

>>7
動物表紙の動物と内容に関係がない場合もある

10 :デフォルトの名無しさん:2015/01/09(金) 17:15:24.57 ID:tI2NmPAJ
>>9
サンキュー

11 :デフォルトの名無しさん:2015/01/10(土) 08:26:14.49 ID:iL1AszUz
質問です。

前スレで、List の関数を使った時の最適化について書かれていましたが、
それって、. (dot) で関数合成した時と、$ 若しくは () で関数を繋いでいった時で
違いはありますか?

時々、
unlines . sort $ lst
unlines $ sort lst
みたいな書き方のどちらが良いか、疑問に思うことがあります。

12 :デフォルトの名無しさん:2015/01/10(土) 09:07:18.18 ID:6Zs1j09x
Vim本はメガネザル

13 :デフォルトの名無しさん:2015/01/10(土) 10:14:04.82 ID:FFZpwEly
>>11
最適化オプション付けるとインライン展開可能な関数は全てインライン展開されるから、そこで挙げてる程度の違いは気にする必要無し

14 :デフォルトの名無しさん:2015/01/11(日) 01:39:49.80 ID:jxNnnj3b
[´・_ テレビで女の子が男のあそこに触れて「硬い!!」とか言ってたぽよ

15 :デフォルトの名無しさん:2015/01/11(日) 01:53:57.06 ID:q/YrvBDO
下記の問題について自分なりにプログラムしてみましたが、
問題の性質を静的に(宣言的に)表しているとは言い難いような気がします。
その性質自体がいくぶん動的な体をしているので仕方ないかも知れませんが。
皆さんなら、どのようにプログラムするでしょうか。

[問題]
型aの値には「大きさ」という属性があり、それは関数 (HaveSize a) => size :: a -> Int で得られる。
ただし戻り値は正の整数で、また、size x = size y となる x, y ∈a も存在する。

問題は、型 [a] の値と大きさ n(非負正数)のコンテナがあるとき、
[a] の要素を左から順にコンテナに溢れ出ないように詰め込んでいった場合に
どれだけの部分リストが詰め込めるかを調べる関数 saturate を作ること。

[例]
map size [a, b, c, d, e] = [2, 1, 3, 2, 3] とする。
コンテナの大きさが 7 なら、[a,b,c] がコンテナに詰め込める。
なぜなら [a, b, c] の大きさの合計が 2+1+3=6 で、
更に d を詰めようとすれば 6+2=8 になりコンテナの大きさを超えるからである。
コンテナの大きさが 6 の場合も同じく [a, b, c] まで詰め込める。
コンテナの大きさが 1 以下なら詰め込める部分リストは空リスト [] である。

[私の解答例]
saturate :: (HaveSize a) => Int -> [a] -> (Int, [a])
saturste _ [] = (0, [])
saturate n (x:xs)
  | n < s = (0, [])
  | otherwise = (s, x) +: saturate (n - s) xs
 where s = size x

infixr 5 +:
(+:) :: (Int, a) -> (Int, [a]) -> (Int, [a])
(m, x) +: (n, xs) = (m + n, x: xs)

16 :デフォルトの名無しさん:2015/01/11(日) 02:13:40.35 ID:q/YrvBDO
>>15
ちなみに、関数 saturate の型について細かいことは問いません。

最低限、引数としてリスト [a] とコンテナのサイズがあり、
戻り値として実際に詰め込めた部分リスト [a] があればいいです。
他の引数があっても、制約を課してもいいです。

解答例のように部分リストの大きさも同時に分かれば尚いいですが、
それは後から sum . map size でも得られるので無くてもかまいません。


ちなみに、ちなみに、私の自分の解答に対する不満というのは、
問題の中に特に再帰的な性質が陽に現れている訳ではないのに、
関数の中で再帰を陽に使っていることです。

これは、たとえば部分が全体の縮小版になっているという
本質的に再帰的な性質を持つ階乗の計算をする関数を
再帰を陽に使って表すのとは訳が違う、ような気がなんとなくします。

17 :デフォルトの名無しさん:2015/01/11(日) 08:16:23.15 ID:q/YrvBDO
>>16
もしかして、再帰は再帰でも、分割統治の出番ですか?

18 :デフォルトの名無しさん:2015/01/11(日) 10:28:31.59 ID:xBHWy4LP
Prelude> let f n = last . takeWhile ((>=) n . sum) . foldl (\ ls a -> ls ++ [last ls ++ [a]]) [[]]
Prelude> f 7 [2,1,3,2,3]
[2,1,3]
Prelude> f 6 [2,1,3,2,3]
[2,1,3]
Prelude> f 1 [2,1,3,2,3]
[]

19 :デフォルトの名無しさん:2015/01/11(日) 11:13:36.60 ID:xBHWy4LP
Prelude> class HaveSize a where size :: a -> Int
Prelude> instance HaveSize [a] where size = length
Prelude> let f n = length . last . takeWhile ((>=) n . sum) . scanl (\ ls a -> [a] ++ ls) []
Prelude> let saturate n xs = take (f n $ map size xs) xs

Prelude> saturate 7 ["aa", "b", "ccc", "dd", "eee"]
["aa","b","ccc"]
Prelude> saturate 6 ["aa", "b", "ccc", "dd", "eee"]
["aa","b","ccc"]
Prelude> saturate 1 ["aa", "b", "ccc", "dd", "eee"]
[]

20 :デフォルトの名無しさん:2015/01/11(日) 12:49:54.72 ID:kRBMF/fR
リストが再帰的なんだから仕方ないんじゃない?
リストに対する明示的な再帰が嫌なら
saturate = flip $ foldr (\x t n -> if n < size x then [] else x : t (n - size x)) (const [])
saturate n xs = map snd $ takeWhile ((<= n) . fst) $ zip (scanl1 (+) (map size xs)) xs
あたりが素直なんじゃないかな。

21 :デフォルトの名無しさん:2015/01/11(日) 18:26:01.66 ID:yONU8dYO
アホな質問でスマンが、
すごいhaskell本のp140 7章 木を植えよう の
treeInsert関数が 型引数a と 引数xを比較してるように見えるんだけど
haskell初心者の自分にしては意味不明なんだけど
どういう事なんだ。。。

22 :デフォルトの名無しさん:2015/01/11(日) 18:42:53.13 ID:wpfi8qHR
>>15
http://codepad.org/Lf22gQhJ

>>20
ちゃんと Node a 〜〜ってパターンマッチして変数名付けてあるよ

23 :デフォルトの名無しさん:2015/01/11(日) 18:44:27.23 ID:wpfi8qHR
安価間違えたスマヌ

24 :デフォルトの名無しさん:2015/01/11(日) 20:31:52.09 ID:xBHWy4LP
ベンチありがとう
sumは漸化で扱うべきだというところまで
考えが至らなかったのはまだまだ修行が足りないな

25 :デフォルトの名無しさん:2015/01/11(日) 20:44:03.47 ID:yONU8dYO
>>22
あっそこパターンマッチして変数名つけてるのか
aが型名に使ってて 型と変数を比較してるように見えて???って状態になった
パターンマッチをよく理解してなかった ありがどう

26 :デフォルトの名無しさん:2015/01/11(日) 21:33:43.65 ID:q/YrvBDO
>>19 >>20 >>22
自分のも含めてですが、どれも数ヶ月後にコードを読み返したとき、
何をやっているのか「すぐに分かる」ようなものではなさそうです。
>>20 の後者のは比較的に問題の仕様を思い出しやすいと思いましたが。
アドバイスをいただいておきながら生意気言ってすみません。
でも参考にさせていただきます。


結果リストの各要素の大きさの合計も同時に得るに誰も挑戦しなかったのは、
それによってコードが一気に複雑になるからですね。
やはり、両者は別の問題を解く計算として分けた方が良さそうですね。


ベンチについてですが、すいません、今回は処理速度はたいして気にしていません。
初めにはっきり言っておくべきでした。
コンテナのサイズもせいぜい50くらいです。
求めていたのは、問題の仕様をいかに宣言的にコード化するかでした。

それに、素直にやれば計算量オーダーは O(n) のはずなので、
各例とも極端な差は出ないのではないでしょうか。


ともかく、ありがとうございました。
参考にさせていただき、自分のコードを見直します。

27 :デフォルトの名無しさん:2015/01/11(日) 21:52:14.39 ID:37IhO0lo
>>14
なりすまし死ね!

28 :デフォルトの名無しさん:2015/01/11(日) 22:35:26.27 ID:Wjx+GIH1
>>27
スルー&NGワード推奨。

29 :デフォルトの名無しさん:2015/01/11(日) 23:09:31.16 ID:xBHWy4LP
これ
> 結果リストの各要素の大きさの合計も同時に得るに誰も挑戦しなかったのは、
> それによってコードが一気に複雑になるからですね。
自分で言われてるように、必要ないものを同時に考えたくないだけで省いた
> それは後から sum . map size でも得られるので無くてもかまいません。
説明が丁寧なのはいいのだけど、HaveSizeクラスの部分とかも
ちょっと問題が冗長だと感じました。

30 :デフォルトの名無しさん:2015/01/11(日) 23:59:31.77 ID:ajGCArfk
>>26
再帰的な構造のデータから再帰的な構造のデータを得ようとしているんだから、
そこで「再帰は何か違う」って言ったら手続き的に書くしかないと思うよ

31 :デフォルトの名無しさん:2015/01/12(月) 00:23:49.94 ID:YuUyOY1J
再帰とかよりも宣言的であることが大事だったってことじゃない?

今回の場合は inits を使うようなやり方だと宣言的になりやすいと思う。
import Data.List (inits)
saturate n xs = last $ takeWhile ((<= n) . sum . map size) $ inits xs
でも inits を使うと O(n^2) になってしまう。

map reverse $ inits xs なら O(n) で作れるけど、少し煩雑になる。

他は>>15>>20と同じようなことになってあまり宣言的じゃなくなると思う。

32 :デフォルトの名無しさん:2015/01/12(月) 00:40:22.44 ID:YcSZDoGu
そこは再帰を「自分で書く」のは何か違うという意味で
高階関数を使えってことだと解釈してたわ

33 :デフォルトの名無しさん:2015/01/12(月) 00:49:23.67 ID:65bVV+dl
dropWhile or takeWhile は、「溢れたもんを除く」って性質を表せていて分かりやすいと思う。

34 :デフォルトの名無しさん:2015/01/12(月) 01:44:40.42 ID:JPDNTFYW
質問がうまくできず、余計な推測の手間をかけてしまったようで申し訳なかったです。

再帰を陽に使っているという言い方が完全に間違っていました、すいません。
再帰を手続きっぽく使っているというべきでした。

たとえば、リストに対する分割統治アルゴリズムも再帰的ですが、
部分を解く計算が全体を解く計算と同じなので、
<全体の解> = <部分1の解> `合成する` <部分2の解> とか、
<全体の解> = <部分のどれかの解>
などの構造でプログラムが書けるので非常に宣言的に見え、気持ちいいです。
ソースから何を解いているのかを読み取るのも比較的に楽ですし。

それに比べて >>15 の再帰の使い方は、いかにも
C 言語で for ループを使っているところをHaskell に直訳しました的な感じで、
とても手続きっぽく見えて気持ち悪いです。

そういう再帰の使い方を裏に隠すのが foldl などの標準ライブラリ関数なので、
>>32 の解釈のとおりなのですが、そうすると今度は
上手くやらないと書かれたソースが技巧的になる傾向があり、
宣言的だけど意図が分かりにくいということになりかねません。

宣言的で読み解きやすいプログラムにはできないものか、という質問でした。


>>33
はい、参考にさせていただきます。

35 :デフォルトの名無しさん:2015/01/12(月) 10:01:32.94 ID:SO+1IXbJ
途中で何を求めてるのか、分かりやすさ重視だとこんな感じ?

saturateSimple :: HaveSize a => Int -> [a] -> (Int, [a])
saturateSimple _ [] = (0, [])
saturateSimple n xs
  | 0 <= n = (sumSize, taked)
  | otherwise = (0, [])
 where
  sumSize = sum $ map size taked
  taked | Just takeRange' <- takeRange = take takeRange' xs
     | otherwise = xs
  takeRange = findIndex (>n) sizedList
  sizedList = scanl1 (+) $ map size xs

36 :11:2015/01/12(月) 10:36:14.90 ID:Ah5MZkQB
>>13
レス、ありがとうございます。

これからは、安心して、見やすさとかで決めていくことができます。

37 :チラシの裏:2015/01/12(月) 12:17:22.38 ID:2dVlW8Fh
溢れたもんを除くって考え方が富豪的
初めから有効な物しか生成しないのが細民的
じゃあ有効な物しか生成しないってどうやるのって考えると、その関数も扱うデータがメタになっただけで結局のところ溢れたもんを除いてる
但し富豪版に比べてそういった関数ではショートカットの指示を組み込むことができる
じゃあ富豪的に書いて、幾つかショートカットの指示が簡単にアタッチできれば細民版と等価なチューンナップが気楽にできるのではないか

38 :デフォルトの名無しさん:2015/01/12(月) 14:49:07.39 ID:MSt1/O77
くだすれみたいな質問なんですけど
自分で data を定義した時に、その record (?) を纏めて扱いたいのですが
そのような方法はありますか?

具体的にこれを訊きたい状況は次のとおりです:
data Person = {firstName::String, lastName::String, address:String, age:Int}
みたいな構造があったとして、これにたとえば tsv みたいな感じの show を定義したいとき、

import Data.List (intersperse)
instance Show Person where
 show (Person f l ad ag) = intersperse '\t' [f,l,ad,show ag]

みたいに (f,l,ad,ag を) 手で書いていくしかないのでしょうか、というのが最初の疑問
雰囲気的には
show p = intersperse '\t' (fields p)
みたいにかけるとうれしいなあ…と思いつつ型とか考えると無理っぽい気もして、
でも全部手で書くのってなんだかあんまりな気がするので、これを解決したいというものです

39 :デフォルトの名無しさん:2015/01/12(月) 15:40:36.10 ID:YcSZDoGu
>>34
Functional Programming should be your #1 priority for 2015
OOP cannot save us from the Cloud Monster anymore.
https://medium.com/@jugoncalves/functional-programming-should-be-your-1-priority-for-2015-47dd4641d6b9

このコラムの↓の節を読むといいよ
"I've tried. It's too complex and it has poor readability"

40 :デフォルトの名無しさん:2015/01/12(月) 17:56:45.05 ID:SO+1IXbJ
>>38
TemplateHaskellを使う
aesonのData.Aeson.THが似たような事してるから参考にするといい

41 :デフォルトの名無しさん:2015/01/13(火) 00:21:35.96 ID:cYmnRneR
>>40 なるほど名前は漏れ聞こえていましたがこんなところでお目にかかるとは…!
頑張ってみます、ありがとうございます!

42 :デフォルトの名無しさん:2015/01/13(火) 02:03:38.95 ID:MG2YbkJI
関数型言語 - 「純粋関数型」 &「副作用」というトリッキーワードについて想うこと『裸の王様』 - Qiita変更する
http://b.hatena.ne.jp/entry/qiita.com/kenokabe/items/0dfe134428665d66d757

Haskell逸れるけどすごい記事みっけた

43 :デフォルトの名無しさん:2015/01/13(火) 02:51:02.17 ID:GRV5h97d
シッ、目を合わせちゃダメっ

44 :デフォルトの名無しさん:2015/01/13(火) 08:18:51.96 ID:alzVIBRo
その人をどうにかするのが今後の普及のカギ

45 :デフォルトの名無しさん:2015/01/13(火) 08:29:28.64 ID:iwEn0lQM
>>42
コメント欄がすごい

コメントした人におかしな因縁

46 :デフォルトの名無しさん:2015/01/13(火) 09:08:23.86 ID:d5cnoHN3
最終的に遅延評価機構をライブラリとして作れる言語まで純粋関数型になっててワロタ

47 :デフォルトの名無しさん:2015/01/13(火) 09:29:05.89 ID:wsAKsNYg
それ以前に英語力が酷い

48 :デフォルトの名無しさん:2015/01/13(火) 10:37:15.59 ID:MWu5lHoG
このアウトプット量だけは評価できる

49 :デフォルトの名無しさん:2015/01/13(火) 11:12:10.37 ID:ELm0xWmC
kenokabe隔離スレでやれ

50 :デフォルトの名無しさん:2015/01/13(火) 11:42:47.85 ID:QGHEOvQd
>>49
どこにあるのよ・・・この人そんな有名なのか

51 :デフォルトの名無しさん:2015/01/13(火) 11:47:55.94 ID:1H8UE7aj
kenokabe、他人の記事のコメント欄で発狂しとる。

http://qiita.com/hiruberuto/items/26a813ab2b188ca39019#comment-93b50be778fd0aa9d401

この人は大丈夫なんだろうか
そもそも関数型にもOOにもどちらも詳しくないような....

52 :デフォルトの名無しさん:2015/01/13(火) 11:51:54.93 ID:NasWx0i5
この手の○○○○に好まれるのがHaskellなどが敬遠される理由

53 :デフォルトの名無しさん:2015/01/13(火) 11:54:15.25 ID:NasWx0i5
「HaskellのIOモナドは遅延評価でFRP」でワロタ

54 :デフォルトの名無しさん:2015/01/13(火) 12:29:12.79 ID:QwH8/l3X
http://ja.yourpedia.org/mediawiki/index.php?title=岡部健_(荒らし)&oldid=267126

kenokabeのゴシップ記事発見

55 :デフォルトの名無しさん:2015/01/13(火) 13:33:59.30 ID:mZyyNyaz
>>49-50
この板にあったと思うが落ちたっぽい

56 :デフォルトの名無しさん:2015/01/13(火) 13:42:07.71 ID:MWu5lHoG
長くて読む気しない

57 :デフォルトの名無しさん:2015/01/13(火) 13:49:15.58 ID:1SCKzRDk
ネヲチにあったぞ

58 :デフォルトの名無しさん:2015/01/13(火) 13:49:20.91 ID:N/anipzC
なんか心病んでそう。

59 :デフォルトの名無しさん:2015/01/13(火) 13:51:59.41 ID:mZyyNyaz
http://qiita.com/kenokabe/items/0dfe134428665d66d757#comment-447b4dc08c5a4e0530f0
式の参照透明性と、任意の式が参照透明だという言語の性質の区別がつかないのかな?

60 :デフォルトの名無しさん:2015/01/13(火) 13:53:28.65 ID:mZyyNyaz
この板にあったスレ
http://peace.2ch.net/test/read.cgi/tech/1403215505/

61 :デフォルトの名無しさん:2015/01/13(火) 14:12:12.19 ID:GVOYJ26F
>>60
ワラタ

62 :デフォルトの名無しさん:2015/01/13(火) 14:43:33.74 ID:Ti00MPXp
関数型○○○○はリアル世界ではどんな活動してんだ?
勉強会に押し掛けられてあんな熱弁されたら自分が主催者なら出禁にするが。

63 :デフォルトの名無しさん:2015/01/13(火) 14:50:41.62 ID:MWu5lHoG
>>60
やはりこんだけの逸材がヲチられてないわけがなかった

64 :デフォルトの名無しさん:2015/01/13(火) 14:51:56.29 ID:kHWdi0LB
たまにはこういう香ばしい人が出てこないと活気が。
友達にはなりたくないけど。

65 :デフォルトの名無しさん:2015/01/13(火) 16:02:46.26 ID:WRZgnkoL
逸材

66 :デフォルトの名無しさん:2015/01/13(火) 16:29:54.67 ID:x2ugWPUO
アイドル

67 :デフォルトの名無しさん:2015/01/13(火) 16:58:34.76 ID:rzW7OceT
この人、Qiitaも怪文だけど、ブログはもっとぶっ飛んでる

https://plus.google.com/app/basic/102413788769460359022

68 :デフォルトの名無しさん:2015/01/13(火) 19:14:22.19 ID:gOSKC6xL
kenokabeはOCamlもHaskellも知らないのに関数型エヴァンジェリスト気取りなのか。

69 :デフォルトの名無しさん:2015/01/13(火) 21:27:43.51 ID:m5MaD2Xa
この人ooにも関数型にも、どっちのパラダイムも詳しくないのにスゴい記事書くよね
恥をおそれない度胸だけはある

70 :デフォルトの名無しさん:2015/01/13(火) 21:35:42.28 ID:gOSKC6xL
引数が⊥の場合を除いてどんな評価順でも等価になる、というよくある純粋性の定義を
まったく理解できてなかったんだな。
すぐに思いつくだけでもEager HaskellとかUrとかあるんだが。

71 :デフォルトの名無しさん:2015/01/13(火) 21:37:18.30 ID:m5MaD2Xa
>>42

わろた

72 :デフォルトの名無しさん:2015/01/13(火) 22:25:25.54 ID:MG2YbkJI
この冗長な長文は、その、なんだ。どっか病んでるんだろう・・・・。
ブログの方は明らかに異常だし。

73 :デフォルトの名無しさん:2015/01/13(火) 22:28:23.68 ID:MG2YbkJI
"佐々木俊尚 @sasakitoshinao さんが2ちゃんねるでヘイト・誹謗中傷に加担している設定についての考察"
https://plus.google.com/102413788769460359022/posts


これは〇〇〇〇ですねぇ・・・

74 :デフォルトの名無しさん:2015/01/13(火) 22:30:05.02 ID:MG2YbkJI
事象の地平面(イベント・ホライズン) オブジェクト指向という情報のブラックホール、アンチパラダイムとしての純粋関数型HaskellモナドをUNIXの標準ストリームとconsole.logで読み解く
http://qiita.com/kenokabe/items/b182e41c5ce9ef1cbc49

75 :デフォルトの名無しさん:2015/01/13(火) 22:58:25.21 ID:6joM9log
新作早いな

76 :デフォルトの名無しさん:2015/01/14(水) 00:18:36.08 ID:lNtPuHRx
>>73
完全に名誉毀損なんだがこの人無事で済むかな

77 :デフォルトの名無しさん:2015/01/14(水) 00:19:29.37 ID:lNtPuHRx
「HaskellのIOモナドは、遅延評価でFRP」

78 :デフォルトの名無しさん:2015/01/14(水) 00:25:19.24 ID:iDcmklay
キチガイ無罪ってやつかな

79 :デフォルトの名無しさん:2015/01/14(水) 00:29:33.85 ID:e9uoW40m
毛の壁の話はQiitaとTwitterで十分です

TemplateHaskellとかってみんなどうやって勉強した?というかどの程度使ってる?

80 :デフォルトの名無しさん:2015/01/14(水) 02:23:16.58 ID:jipyguuI
楽しそうだけど、ghc-iosで対応してないから使えないんだ…

81 :デフォルトの名無しさん:2015/01/14(水) 02:52:59.46 ID:mcKb4bst
THは使う専門
だったけどそろそろ使おうかなーって思い始めてきた

82 :デフォルトの名無しさん:2015/01/14(水) 05:28:12.58 ID:0/018ead
東京電力は12日、福島第1原発2号機海側の観測用井戸で採取した地下水の放射性物質濃度が、
前回8日と比較して50倍以上に上昇したと発表した。

原因は不明で、東電広報部は「13日に再度採取して濃度を調べる」と話している。

東電によると、地下水の放射性物質濃度が上昇した井戸は、港湾から約55メートルの距離にある。
12日に採取した地下水には1リットル当たり、セシウム134が140ベクレル、セシウム137が470ベクレル含まれていた。
また、ストロンチウム90などのベータ線を出す放射性物質は1万5000ベクレル検出された。

いずれも、この井戸における濃度の最高値を更新した。

83 :デフォルトの名無しさん:2015/01/14(水) 05:30:02.49 ID:8+86tzom
初めてのプログラミングでHaskellて
どうでしょうか?

84 :デフォルトの名無しさん:2015/01/14(水) 08:08:18.99 ID:dWmqx90i
http://ja.yourpedia.org/wiki/%E5%B2%A1%E9%83%A8%E5%81%A5_(%E8%8D%92%E3%82%89%E3%81%97)

kenokabe

85 :デフォルトの名無しさん:2015/01/14(水) 08:49:21.39 ID:e9uoW40m
あと、しばらくHaskell使って書いてみてたんだけど、既存のモナドを使う以外にモナドを活かせない
問題に合わせて自己定義のモナドを利用するわかりやすい例が乗ってるサイトとかないでしょうか

86 :デフォルトの名無しさん:2015/01/14(水) 09:04:23.74 ID:jipyguuI
幽霊型(ファントム・タイプ)って何? どういう時に役に立つもの?

87 :デフォルトの名無しさん:2015/01/14(水) 09:29:38.17 ID:Bk8LvlSf
>>85
Freeモナドで状態遷移が分かりやすかった
Freeモナドにするだけでいろんなモナドの機能がタダで手に入るので
モナド自作するならまずFreeを考えるようにしてる

88 :デフォルトの名無しさん:2015/01/14(水) 10:26:14.65 ID:4jaQ7hCV
>>77
えぇ〜!?

89 :デフォルトの名無しさん:2015/01/14(水) 10:38:54.43 ID:Bk8LvlSf
ふと、HugsでFreeモナドって使えるのかなと調べたら...
http://glengreen.com/wp-content/uploads/2014/04/free-hugs.jpg

90 :デフォルトの名無しさん:2015/01/14(水) 11:51:15.04 ID:f0jv2pls
>>77
えぇ〜!?

91 :デフォルトの名無しさん:2015/01/14(水) 18:46:30.59 ID:mcKb4bst
>>86
ファントムタイプってのは data A a b c = A { foo :: a, bar :: b } って定義した時の c みたいに実際に保持する値の型とは関係ない型パラメータの事。
データの内部状態を表したり、関連のある他の型を表したりするのに使う。

92 :デフォルトの名無しさん:2015/01/14(水) 19:32:56.59 ID:jipyguuI
> データの内部状態を表したり、関連のある他の型を表したりするのに使う。

な、なるほど?
A a b Char と A a b Int は同じデータコンストラクタで値を作れるけど、型は違うよ、ってことを明示できる、みたいな??
興味深いけど、有用なシーンがパッと思いつかないっす。。

93 :デフォルトの名無しさん:2015/01/14(水) 20:40:36.31 ID:mcKb4bst
>>92
型パラメータの数を、コンストラクタを書くのに必要な数よりも多くする事が出来るよってだけの機能だからね
例えば、XMLを扱う時に、同じ意味のデータが色んな種類のノードの属性として設定出来て、だけど明確に区別して扱う必要がある時なんか便利な場合の1つ
<foo name="hage"><bar name="debu">
みたいな感じの時に
newtype Name a = Name Text
data Foo
data Bar
ってして、Name FooとName Barを取り違える事が無いように出来る。
だけど、どっちも中身は一緒だから同じ処理を行うことが出来る。

94 :デフォルトの名無しさん:2015/01/14(水) 21:22:15.46 ID:jipyguuI
>>93
なるほど!

95 :デフォルトの名無しさん:2015/01/15(木) 01:36:34.74 ID:sgAYXfdG
>>94
代数データ型で data Value = MyInt i | MyBool b | MyChar c みたいなのを
定義してやったときに、Valueに対する関数の中で、3種類のどれに対してもは
意味をなさないような、そういう関数を定義したくなることがある。
"prettyprint"みたいなのはどの値にも適用できるし適用したいが
たとえば"not"みたいなのはMyIntやMyCharな値に対しては定義したくない。
かといってundefinedにしてしまうと型検査の恩恵を放棄してしまうことになる。
そういう時に data Value tag みたいに幽霊型でタグ付けをして、
not :: Value Bool -> Value Bool みたいに型をつければいいんじゃね、というのが典型的な使い方では?

あと、タグのところに型レベル自然数とか入れてやれば依存型の真似事もできる。

96 :デフォルトの名無しさん:2015/01/15(木) 05:30:44.53 ID:xElnjyle
関数型は銀の弾丸なんですか?素朴な疑問

世界を見渡して、それを主張している人は居たりしますか?

97 :デフォルトの名無しさん:2015/01/15(木) 08:18:03.39 ID:s7mFuZtY
>>96
最近Qiita で有名なkenokabeさんという人はそう言ってる。ただ、信じてる、ってだけで証拠は無いみたい。

銀の弾丸である、って主張する為には、それを取り入れたために問題解決が飛躍的に捗るようになった、って例をあげなきゃならないけど、少なくともHaskell に関してそういう話は聞かないね。
積極的に採用してる企業の話も何故かあまり聞かない。NTTデータ? だっけ。あとは金融系とか? よく知らない。

98 :デフォルトの名無しさん:2015/01/15(木) 08:19:40.92 ID:s7mFuZtY
でもNTTデータはコーディング規約でdo構文を禁止しているらしいね…。

99 :デフォルトの名無しさん:2015/01/15(木) 08:30:46.11 ID:rIDPcTew
日経ソフトウエア 記者の眼 2014/09/26 大森 敏行
オブジェクト指向や関数型は「敗者の道具」である (4/4)

NTTデータでは独自に定義したコーディング規約や夕会でのコードレビューといっ
た工夫をしています。例えばコーディング規約には「if文、case文の使用禁止。
パターンマッチもしくはガードを利用する」「do構文の使用禁止」...

つらポヨ

100 :デフォルトの名無しさん:2015/01/15(木) 09:38:12.35 ID:4U9NF0gk
ほざけ。銀の弾丸ではないというなら、立論してみろ

101 :デフォルトの名無しさん:2015/01/15(木) 10:20:39.64 ID:rIDPcTew
「わぁい 悪魔の証明 あかり 悪魔の証明 大好き」

102 :デフォルトの名無しさん:2015/01/15(木) 10:24:42.19 ID:6WtClJFS
ゆるゆりもすっかり廃れたな

103 :デフォルトの名無しさん:2015/01/15(木) 11:46:00.46 ID:m4up9uXT
>>98
ラムダ禁止じゃないなら面倒なだけで問題ではないな

104 :デフォルトの名無しさん:2015/01/15(木) 11:55:29.23 ID:E2BgZv7k
そろそろモナドを自己定義してつかってみたいなっていう程度のレベルの人間がいきなりFreeとかOperationalに手を出して良いもの?

そもそもモナド変換子つかって既存のモナドを組み合わせることに慣れるのが先かな

105 :デフォルトの名無しさん:2015/01/15(木) 12:06:21.82 ID:rIDPcTew
御大は「記法に幅を持たせてプログラマに選ばせることこそ約束された勝利の...」と言ってる
ミカカピラミッドの労働者に選択権が与えられてないことは問題では?

出展: http://research.microsoft.com/en-us/um/people/simonpj/papers/haskell-retrospective/HaskellRetrospective.ppt
Syntactic redundancy
- Seductive idea: provide just one way of doing any particular thing
- Haskell's choice: provide multiple ways, and let the programmer decide
- Main example: "declaration style" vs "expression style"

SLPJ's conclusion syntactic redundancy is a big win

106 :デフォルトの名無しさん:2015/01/15(木) 17:28:29.01 ID:f2vn4nEl
>>96
「人月の神話」によると、そもそも銀の弾丸は存在してなくて、言語やデータベースの選択以前に、既にデスマーチは始まってる。
(従来のシステムに、これとあれとそれ加えて。 仕様? 従来システム見りゃ分かるでしょ、とかね)

107 :デフォルトの名無しさん:2015/01/15(木) 17:45:25.19 ID:J9qaHf6O
>>101
この場合は関数型使って起きる問題1つ取り上げればOKじゃないか?

108 :デフォルトの名無しさん:2015/01/15(木) 20:36:18.58 ID:RFmTHJSs
銀の弾丸があったところで日本の大手SI屋は採用しないんじゃないの

109 :デフォルトの名無しさん:2015/01/15(木) 21:10:10.16 ID:JATjUjrD
 θ
θθ
θθθ<do禁止を採用!

110 :97:2015/01/15(木) 23:53:19.07 ID:OORFnd44
>>100 銀の弾丸でないというのなら、
俺に言ってる?
俺は、関数型が銀の弾丸ではない、なんて主張してないよ。
むしろ関数型は銀の弾丸だと信じたい派。でも彼の氏と同様に根拠は持ってないんだ。

関数型が実世界で実際に有用だ、ってことを確認するためには、もうちょっと利用者が多くなくちゃだと思う。でも評判の割に広まってない気がする。
普及のボトルネックはなんなんだろうね。
計算量が見えにくいから? 一般に言われてるように、モナドが難しいから? チュートリアルが足らない?

少なくともdo禁止は、普及の為には良くないと思うぜ。

111 :デフォルトの名無しさん:2015/01/15(木) 23:54:04.90 ID:JATjUjrD
モナド発動
http://ecx.images-amazon.com/images/I/71R2WqhkWhL._AA1200_.jpg

112 :デフォルトの名無しさん:2015/01/16(金) 00:19:47.27 ID:jXGCgSDl
計算量が見えにくいのは関数型だからというよりは評価戦略が遅延評価だからでは?

113 :デフォルトの名無しさん:2015/01/16(金) 00:29:40.13 ID:7RAOESVp
すまんよく混同しちゃう。Haskellに限った話でよろしく。

あとはcabalが初心者にとっては分かりにくいかも?

114 :デフォルトの名無しさん:2015/01/16(金) 00:40:35.56 ID:jXGCgSDl
最近その手の話題で荒れてるからね
言葉尻捉えて申し訳ない

RustのCargoすごいわかりやすいんだよね
慣れればcabalも強力なんだろうけど

115 :デフォルトの名無しさん:2015/01/16(金) 06:21:28.78 ID:m6F6FFaY
Haskell始めて茶碗洗いも遅延評価になった

116 :デフォルトの名無しさん:2015/01/16(金) 11:55:10.02 ID:Kt0KQddJ
再代入が出来ない、ループ構文がない
この二つが最大の壁

117 :デフォルトの名無しさん:2015/01/16(金) 18:51:06.11 ID:23PqdXkM
>>116
>再代入が出来ない、ループ構文がない
>この二つが最大の壁

この二つが壁でもなんでもないことに気がつくのが最大の壁。
つうかそもそも代入じゃないから「再」代入というのすらおかしい。

118 :デフォルトの名無しさん:2015/01/16(金) 21:03:26.63 ID:RnIhG8e/
>>110
関数型が中々普及しないのは実装が普及してなくてこの言語じゃないとできないって事がないからじゃない?
たとえばjavascriptなんかはいい言語だから流行ったわけじゃなくてブラウザに実装されてるしクライアント側を弄りたいならこれしかないから流行った

関数型でたぶん一番流行ってるscalaはjvmで使えてjava資産が使える上に関数型っていう+αを提示できたから流行ったんだと思う 

119 :デフォルトの名無しさん:2015/01/16(金) 21:04:40.44 ID:RnIhG8e/
後 rubyが普及したのもrailsのおかげだしね

120 :デフォルトの名無しさん:2015/01/16(金) 21:54:11.44 ID:3StKnz1e
教育者は代入と呼ばずに束縛と呼ぶわけを学習者が初見の時に確認するべきだ
Haskellでは代入を束縛と呼ぶのだと勘違いしたまま流してしまう者が出る

121 :デフォルトの名無しさん:2015/01/16(金) 22:20:54.89 ID:23PqdXkM
値自体に直接名前がついてる束縛と、値を入れた箱に名前がついてる代入との差、とでも教えるかな。
右辺値の時は親切に箱の中まで見てくれてるだけ、と。

まあ、kenokabeが右辺値と左辺値の違いも知らんで
i = i+1 を「論理破綻している!」とか喚いてるのを考えれば
教育的必要もないではないのか。

122 :デフォルトの名無しさん:2015/01/16(金) 22:33:50.78 ID:7RAOESVp
なるほどー

Scalaの特徴は「今までの資産が使える」
Rubyの特徴は「Railsが使える」
そしてHaskell の特徴は「代入が出来ない」
…は?
ってなるってことね。

そうじゃなくて例えば、「その制約がある代わり、実行速度はC言語より速い!」みたいに言えばいいわけだ。

123 :デフォルトの名無しさん:2015/01/16(金) 22:49:03.95 ID:M7+5sHyE
>>39
せっかくなので、すべて読みました。
ですが、ごめんなさい。
>>39 さんが結局のところ私に何を伝えたかったのか、
いろいろ考えてみましたが分かりませんでした。

124 :デフォルトの名無しさん:2015/01/16(金) 23:04:38.96 ID:7BNe3Ira
>>123
横だけど、「初心者のうちは汚く見えるコードでも、慣れると自然に読めるようになるもんだ」って意見だと思った。

125 :デフォルトの名無しさん:2015/01/16(金) 23:18:49.11 ID:aNG0k4BC
Typeclasspedia(和訳:http://snak.tdiary.net/20091020.html)でも同じような指摘があったな

126 :デフォルトの名無しさん:2015/01/16(金) 23:22:33.08 ID:aNG0k4BC
lamdabotとhoogleをローカルに飼いたい...

127 :デフォルトの名無しさん:2015/01/16(金) 23:50:28.40 ID:23PqdXkM
>>126
lambdabotは普通にcabal installで入らなかったっけ??

128 :デフォルトの名無しさん:2015/01/17(土) 00:09:37.52 ID:Rzvv0lBm
ありがとうやってみるよ

129 :デフォルトの名無しさん:2015/01/17(土) 00:15:24.46 ID:nbXIjbMv
>>126
hoogleをローカルで使う方法はググればいくつか出てくるが、
それでも分からない、やったけどエラーが出るということ?

130 :デフォルトの名無しさん:2015/01/17(土) 00:18:10.70 ID:nDBRDZK6
lambdabotって初めて知った。ウィキの説明みても、なんか色々できるってかんじでボンヤリしててピンとこないんだけど、実際の開発で役に立つものなの?
ポイントフリーリファクタリングは楽しそうだね。

131 :デフォルトの名無しさん:2015/01/17(土) 03:36:07.71 ID:Z6TDshQk
やってみたが、lambdabot-5.0のビルドは恐ろしく面倒だった……
なんとかビルドできるが、cabalファイルとソースの書き換えをかなり。

132 :デフォルトの名無しさん:2015/01/17(土) 10:05:51.71 ID:6s7WqR3f
お!関数型神、今度はよそにも噛みつきだしたぞ( ´ー`)
http://qiita.com/satomip/items/f37fcdf74d0288d5d006

133 :デフォルトの名無しさん:2015/01/17(土) 10:12:22.85 ID:wxApzmRD
qiitaって特定ユーザのブロックとかないんだっけ
こいつのおかげで実装されそうだな

134 :デフォルトの名無しさん:2015/01/17(土) 11:19:38.89 ID:9f7/hZue
>>105
データのロゴって、イルミナティだよね

135 :デフォルトの名無しさん:2015/01/17(土) 13:05:32.01 ID:U3O9F3X5
>>132
結局、Qiitaもkenokabeみたいな奴の溜まり場になりそうで怖い
何が怖いって、こいつの記事をストックしてる人数だよ。手遅れかも知れない

136 :デフォルトの名無しさん:2015/01/17(土) 15:14:24.66 ID:QMmm32TZ
象已死
函数當立
歳在乙未
喧嘩大好

137 :デフォルトの名無しさん:2015/01/17(土) 15:33:21.34 ID:RqygZy6s
関数型でググるとあれがtopで出てくるのはどうにかならんか
他の良質な記事を抑えて出てくるもんなぁ

138 :デフォルトの名無しさん:2015/01/17(土) 15:37:32.93 ID:Ic5awU+0
Qiitaの記事が登録しないと読めないようになれば解決する

139 :デフォルトの名無しさん:2015/01/17(土) 18:27:59.89 ID:RqygZy6s
そうはしないだろ
アレがいつも通りに弁護士に訴える詐欺とかすればqiitaでも凍結とかされそうだけど
何故かqiitaではそういう事しなさそうだし
他の関数型ガチ勢には何故か真っ向から突っ込んだりしないし
関数型ガチ勢もアレ呼ばわりして触れたがらないし
初心者に対してほんと悪影響だな 
勘違いした関数型信者と関数型に対して偏見を抱いたプログラマを生成してる

140 :デフォルトの名無しさん:2015/01/17(土) 18:29:10.30 ID:Z6TDshQk
>>139
>勘違いした関数型信者と関数型に対して偏見を抱いたプログラマを生成してる

後者は確かにいるが、前者は本当にいるのか?

141 :デフォルトの名無しさん:2015/01/17(土) 18:35:31.03 ID:Z6TDshQk
うーん。後者はpotimarimoとかmakotokuwataとかイタいのが何匹かいるな。
とりあえず駱駝師匠と毛の壁の邂逅が待ち遠しいのうww

142 :デフォルトの名無しさん:2015/01/17(土) 18:44:10.97 ID:RqygZy6s
>>140
いや毛の壁をストックしている人にいるだろうっていう予想

143 :デフォルトの名無しさん:2015/01/17(土) 18:52:03.13 ID:Z6TDshQk
>>142
それまでに関数型プログラミングしたことあればあれをストックはしないよな。
で、毛の壁さんはマトモにコード書かないので、そういうひとたちには
どういうのが関数型プログラミングなのか読んでもわかんないでしょ。
だから、信者にすらなりようがないと思うんだが。

毛の壁もCodeIQかなんかの問題でも関数型で解いてみせりゃいいのにねえw
それにしてもなぜ関数型自己陶酔エヴァンジェリスト様がJavaScriptとかSwiftとか
つかってんだろうなあ(棒

144 :デフォルトの名無しさん:2015/01/17(土) 19:33:20.25 ID:RqygZy6s
そういやhaskellコードとか書かないよね
haskell,scala,ocamlの話とか殆どしねーし

145 :デフォルトの名無しさん:2015/01/17(土) 19:35:51.64 ID:Ic5awU+0
関数型プログラミング言語が分からない人の味方だからじゃない?w

146 :デフォルトの名無しさん:2015/01/17(土) 22:25:30.38 ID:nDBRDZK6
おいw NGワードでさばききれんよw

何が怖いんだか全然わかんないだけど、例えば、Haskell スレ民にとってkenokabeさんがもたらす最悪の事態、って何?

147 :デフォルトの名無しさん:2015/01/17(土) 22:44:38.21 ID:rzZFM78t
さあ?
よく見てないけど、その人が暴れるとHaskell Wikiが荒れたり
Hackageが落ちたりFunctional Pearlが読めなくなったりするのだろうか?

148 :デフォルトの名無しさん:2015/01/17(土) 22:45:16.36 ID:wxApzmRD
ぶっちゃけ特にない
あれ読んで誤解するならそもそも向いてない人だろうし

149 :デフォルトの名無しさん:2015/01/18(日) 00:00:31.56 ID:kH3OICBy
右翼を装った左翼が街中を街宣車で煩く軍歌流して駆け回ってると人々は
右翼はイかれた迷惑な奴らだから彼らの言うことに耳を傾けないようにしよう
と考えるようになる

150 :デフォルトの名無しさん:2015/01/18(日) 00:14:53.57 ID:X/G7lLxo
>>132
完全に嫌がらせだよな。荒らしに近い。

151 :デフォルトの名無しさん:2015/01/18(日) 00:17:22.53 ID:tpa5WE6c
>>149
右翼が関数型プログラミングってことね?
関数型に関する記事を書いたり、ツイートしたりするのがやり難くなる、ってことか。読者に無視を決め込まれたり、迷惑がられたりする怖れがあるから。

なるほど、そういわれると俺んとこに流れてくるツイートも最近、ピリピリしてるのが多い気がする。

152 :デフォルトの名無しさん:2015/01/18(日) 00:24:23.33 ID:tpa5WE6c
ふーむ。積極的に記事書かないから、そういう感覚は無かったな…

今でも合コンとかお見合いとかで「趣味は2ちゃんヲチです」って堂々と言いにくいけど、kenokabeさんの事態が進行すれば最悪、転職するときとかに困ったことになるワケだ。
面接官「あなたが使えるプログラミング言語は何ですか?」
俺「JavaとRuby」
面接官「ほうほう」
俺「あとHaskell です」
面接官「ヒエッ」

153 :デフォルトの名無しさん:2015/01/18(日) 01:08:45.30 ID:IU9bGGXQ
そんな企業願い下げだ

154 :デフォルトの名無しさん:2015/01/18(日) 02:09:58.36 ID:LNrZ+2U/
Haskellは嫌な思いしてないから
それに関数型が嫌な思いをしようがHaskellの知った事ではないわ
だって全部どうでもいいコメントだし
大袈裟に言おうがIOが使われてもなんとも思わん
それは型システムのエラーがないから
つまり関数型に対しての情などない

155 :デフォルトの名無しさん:2015/01/18(日) 02:30:49.62 ID:V765A4GC
Haskell はちばけんま産だったかぁ

156 :デフォルトの名無しさん:2015/01/18(日) 03:13:27.52 ID:vV/jf7DW
圏論完全に理解した!!!

157 :デフォルトの名無しさん:2015/01/18(日) 06:32:59.94 ID:EYEBc+Bn
講義したまえ

158 :デフォルトの名無しさん:2015/01/18(日) 13:12:39.69 ID:jSIag6l6
http://qiita.com/kenokabe/items/3e167c6742f14af7756d

とりあえず、毛が大学で数学をまったく触ったことがないことはよくわかった。
自然数の構成の話すら知らず、ベクトルと直積の関係すら理解できてない。
それにしても加法や乗法みたいな演算まで「数」なんですかw
「+n」と「n」の区別が付かない人っていやあねえ。

159 :デフォルトの名無しさん:2015/01/18(日) 13:13:11.88 ID:jSIag6l6
こいつの話ってなんでラムダ計算が出てこないの?

160 :デフォルトの名無しさん:2015/01/18(日) 13:39:15.56 ID:5TdGTnEJ
(タイトル見て!!圏論!!と思ったら圏論の話全く出てこなかったでござる、かなしい)

161 :デフォルトの名無しさん:2015/01/18(日) 13:41:53.04 ID:28lxxI0L
もう毛の話はいいよ

162 :デフォルトの名無しさん:2015/01/18(日) 14:56:18.70 ID:HnHximbt
このkenokabeというのはアンチ関数型が放った刺客

163 :デフォルトの名無しさん:2015/01/18(日) 14:58:12.81 ID:HnHximbt
「kenokabe」だから続けて読んで、「毛の壁」というあだ名でTwitterでは有名だったらしい。
だった、というのは、彼のアカウントが凍結されてるから。

164 :デフォルトの名無しさん:2015/01/18(日) 15:20:29.05 ID:IU9bGGXQ
Qiitaもはやいとこブロック機能なり通報なり凍結なりの対処しないとオワコンまっしぐらだぞー

165 :デフォルトの名無しさん:2015/01/18(日) 15:39:04.34 ID:xe/M680A
もう手遅れ

自分への批判や揶揄は何が何でも返答しておかないと我慢できない病気だから、
今後も「困ったチャン」として暴れまわる。Twitterでそれは実証されている。

166 :デフォルトの名無しさん:2015/01/18(日) 15:45:31.62 ID:Eb4kkeMA
kenokabeは現在、矢部という京都弁護士会の弁護士から刑事告訴されているから、
近いうちに起訴されて有罪になると思うよ。そうなったら黙るかな。
あと、民事レベルの名誉毀損も何人かに対して行ってるから、そのうち摘む。

167 :デフォルトの名無しさん:2015/01/18(日) 17:41:12.51 ID:IU9bGGXQ
刑事告訴って何やらかしたんだ

168 :デフォルトの名無しさん:2015/01/18(日) 18:22:35.00 ID:V765A4GC
駱駝師匠普通に参戦してるじゃねーか

169 :デフォルトの名無しさん:2015/01/18(日) 18:49:10.13 ID:UJxN9Diw
>>167
自分の悪口を2chに書き込んでるのはこの弁護士だって妄想を抱き誹謗中傷を繰り返した

170 :デフォルトの名無しさん:2015/01/18(日) 19:09:17.47 ID:UJxN9Diw
>>150
荒らしに近いってか荒らしだろ

171 :デフォルトの名無しさん:2015/01/18(日) 19:12:47.48 ID:+m9GpZ+l
kenokabeが刑事告訴される原因になったブログは現在も削除されてないから、
リンク先にあるリンクからどうぞ。

https://plus.google.com/app/basic/102413788769460359022

172 :デフォルトの名無しさん:2015/01/18(日) 19:17:54.55 ID:HhZm6YeP
kenokabeによる弁護士に対する誹謗中傷ブログはこちら
http://twittersickuser.blogspot.jp/2014/01/motokentw.html

ちなみにエントリは Part30 まであります。例によって長文病を発揮しているので、これを読む裁判官も大変だろうなと思う。

で、本人は「刑事告訴は虚偽告訴なので、虚偽告訴罪告訴します」と息巻いたものの、
その後は音沙汰なし。
http://twittersickuser.blogspot.jp/2014/04/motokentw-20.html


「公開質問」と銘打っているが、一体どこが公開質問なのかというのは置いておこう。

173 :デフォルトの名無しさん:2015/01/18(日) 19:21:19.88 ID:HhZm6YeP
kenokabeが上記の誹謗中傷ブログの運営者であることの確証はここでとれます。
https://plus.google.com/102413788769460359022

174 :デフォルトの名無しさん:2015/01/18(日) 19:31:26.99 ID:WxVggn07
>>168
駱駝公案書いただけじゃね?
毛の壁と接触してる?

175 :デフォルトの名無しさん:2015/01/18(日) 19:42:56.42 ID:IU9bGGXQ
まとめてQiitaにでもあげといてくれ

176 :デフォルトの名無しさん:2015/01/18(日) 20:45:45.78 ID:V765A4GC
>>174
あーそういう意味じゃないな
接触はしてないと言うかするわけがない
あそこら辺の人はアレがでたらめだとひと目見抜けないと(関数型プログラミング言語を使うのは)難しいって感じで放置しそう

177 :デフォルトの名無しさん:2015/01/18(日) 20:48:19.28 ID:ozX7xrZl
ところで諸君、ここはムスレだ。マスレではないぞ

178 :デフォルトの名無しさん:2015/01/18(日) 20:57:45.23 ID:ERirhDOz
http://b.hatena.ne.jp/entry/237558834/comment/tail_y

179 :デフォルトの名無しさん:2015/01/18(日) 23:09:56.08 ID:m3hmoOOc
最近は毛という壁もある

180 :デフォルトの名無しさん:2015/01/19(月) 07:22:58.14 ID:e75uCkWu
http://qiita.com/kenokabe/items/3e167c6742f14af7756d#comment-8eda55b4f68fc6fdd271

181 :デフォルトの名無しさん:2015/01/19(月) 07:23:57.16 ID:e75uCkWu
本文とタイトルになんの関係もないエントリじゃ、詐欺だろうよ

182 :デフォルトの名無しさん:2015/01/19(月) 08:29:09.56 ID:h1tmdNUx
>>180
「これこれこういう本を読め」って、あんたQiitaでも散々自分の記事のリンク張って、
読めって強要しているじゃないか

183 :デフォルトの名無しさん:2015/01/19(月) 10:06:32.13 ID:tWyHvUIe
もう「毛の壁」の話題はやめようぜ

184 :デフォルトの名無しさん:2015/01/19(月) 10:11:16.40 ID:W5DPVPB8
毛の壁の魅力

185 :デフォルトの名無しさん:2015/01/19(月) 10:34:59.45 ID:W+ZMH4Rm
てか>>182みたいなのは流石に直接言えよ

186 :デフォルトの名無しさん:2015/01/19(月) 11:07:20.34 ID:t2o2vSxL
直接言ったら訴えられそう

187 :デフォルトの名無しさん:2015/01/19(月) 13:09:30.75 ID:7cIVKz16
kenokabeくんが作ったAndroidのコストコのアプリがクソすぎる

188 :岡部健:2015/01/19(月) 13:23:16.84 ID:jdcvUTrq
コストコ!みんなのクチコミ apk
青空文庫を読む apk


便利だよ、使ってねクズども

189 :デフォルトの名無しさん:2015/01/19(月) 16:35:00.12 ID:Wl5S0I/B
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!?

190 :デフォルトの名無しさん:2015/01/19(月) 16:38:17.97 ID:Wl5S0I/B
小説家になろうの投稿作品を綺麗な縦書きで読めるようなビューア作ってください!

191 :デフォルトの名無しさん:2015/01/19(月) 17:36:56.76 ID:RjD6WSsn
せめてスレ違いじゃない内容にしてくれ

192 :デフォルトの名無しさん:2015/01/19(月) 18:31:40.95 ID:zYruZwCt
>>188
この程度だったのか・・・・・

193 :デフォルトの名無しさん:2015/01/19(月) 19:14:55.07 ID:1zvC0LuU
こっちでやれ
http://yomogi.2ch.net/test/read.cgi/net/1419377805/

194 :デフォルトの名無しさん:2015/01/20(火) 01:19:59.90 ID:NaIuJpGP
cabal の仕組みであるところの sandbox を使って依存パッケージを管理した上で
haskell のコードを書いて、ghcmod 使ったりコンパイルしたりする、
という場合、ghc じたいが sandbox に気づいてそこのライブラリを使う、というのは起こらなくて、
myproject.cabal を作るのは必須という理解でいいですか?
なんかくだすれみたいで申し訳ないのですが、どうもハッキリ掴めないのでお許しを

195 :デフォルトの名無しさん:2015/01/20(火) 07:47:39.53 ID:8CmI1DCg
kenokabeの主張

・双方向連結リストじゃない単方向連結リストだ
・「始端」は自己参照的なEmptyPairだ(「終端」ではない)
・でもセルごとの連結ポインタは後続のセルから先行のセルを指すようになっている
・実装は配列

kenokabeちゃんはリストというデータ構造を知らない

196 :デフォルトの名無しさん:2015/01/20(火) 07:50:15.67 ID:8CmI1DCg
kenokabeのプロフィール
https://plus.google.com/102413788769460359022/posts


"通っていた学校 University of California, Los" とあるけど、絶対ウソ。

197 :デフォルトの名無しさん:2015/01/20(火) 07:55:46.62 ID:8CmI1DCg
http://qiita.com/kenokabe/items/aa5705978d6a13753fe2

var $push = M.$push = function(arr, data)
{
arr[arr.length] = data;
};

この実装でなんで
「ほら見ろ逆方向リストで動作するじゃねーか」と
言い張れるのか果てしなく謎だ。

198 :デフォルトの名無しさん:2015/01/20(火) 08:28:14.07 ID:Z11IUfXN
>>194
cabal exec ghc -- --[ghcオプション]

みたいにすればsandbox awareにghc使える。

199 :デフォルトの名無しさん:2015/01/20(火) 10:35:44.47 ID:NaIuJpGP
>>198 あーなるほど、 cabal を通じて呼べるわけですね。
ありがとうございます。ちょっと cabal のマニュアル読み直してきます

200 :デフォルトの名無しさん:2015/01/20(火) 10:58:53.32 ID:Nn6T7LRa
福島第一タンクに転落、重傷 止まらぬ作業事故

201 :デフォルトの名無しさん:2015/01/20(火) 10:59:28.98 ID:Nn6T7LRa
福島第1作業員が死亡=タンク設置工事で落下

202 :デフォルトの名無しさん:2015/01/20(火) 13:21:19.76 ID:r45csLnY
ここもkenokabeのマッチポンプで潰されてんな

203 :デフォルトの名無しさん:2015/01/20(火) 14:58:36.18 ID:Nn6T7LRa
福島第二でも作業員事故1人死亡

204 :デフォルトの名無しさん:2015/01/20(火) 23:34:29.85 ID:Nn6T7LRa
死亡事故で廃炉作業中止し点検へ

東京電力福島第一原子力発電所と第二原子力発電所で、作業員が死亡する事故が相次ぎ、第一原発では、21日廃炉作業を中止して、安全点検を実施することになりました。
背景について東京電力は、記者会見で、「作業量が多くなっていることも考えなければならない」と述べ、作業の進め方や安全対策に問題がないか検討する考えを示しました。

20日午前9時半ごろ、福島第二原発で、廃棄物を処理する建物で点検作業をしていた40代の作業員の男性が、点検用の機具に頭を挟まれ、ドクターヘリで病院に搬送されましたが、死亡しました。
福島第一原発でも、19日午前9時ごろ、雨水をためるタンクの点検をしていた50代の作業員の男性が、高さおよそ10メートルのタンクの天井から転落し、20日未明になって死亡しました。
さらに柏崎刈羽原発でも、19日、作業員が足場から3メートル余り下に転落して大けがをしました。

こうした事態を受けて東京電力は、3つの原発の所長とテレビ会議で結ぶ異例の記者会見を開き、姉川尚史原子力・立地本部長が陳謝しました。
現在、福島第一原発では、廃炉や汚染水対策などのため、去年の同じ時期のほぼ2倍に当たる1日およそ7000人の作業員が働いていますが、
「作業量の急増が、事故が相次ぐ背景にあるのではないかと」問われたのに対し、姉川本部長は、「作業量が多くなっていることも考えなければならない」と述べ、作業の進め方や安全対策に問題がないか検討する考えを示しました。

福島第一原発では、21日、廃炉作業のほとんどを中止し、安全点検を実施することになり、第二原発でも安全の徹底が図られるまで、作業を中止するということです。
福島第一原発では、去年3月にも、崩れてきた土砂の下敷きになって作業員が死亡したほか、11月には、タンクの増設工事中に、鋼材が落下して3人が重軽傷を負うなど、作業事故が相次ぎ安全対策が課題になっています。

東電社長「安全確保までほとんどの作業再開せず」

205 :デフォルトの名無しさん:2015/01/21(水) 10:02:49.56 ID:tSYl3nCX
おまいらletとwhereってどんな風に使い分けてる?

206 :デフォルトの名無しさん:2015/01/21(水) 10:11:05.68 ID:b1WEqEY3
基本 where で気が向いたら let

207 :デフォルトの名無しさん:2015/01/21(水) 10:12:38.22 ID:PxbGo4hc
>>205
気分。
紀文のはんぺん。

208 :デフォルトの名無しさん:2015/01/21(水) 10:12:59.70 ID:mE4mMlsp
>>205
先に定義を見せておかないと後のコードが読めなさそうなものはlet、
名前を見れば何をやってるかわかるよね、なものは後からwhereで補足、
ってのが一般的なんじゃないかね。

ただ個人的にはdoの中ではletも使うが、そうでないところでは
ほぼwhereしか使わん。複雑なのは型を明示してトップレベルに書いちゃうし。
ただ、whereと違ってlet in は式なので、declaration styleではなく
expression styleの人はlet の方がいいはず。

209 :デフォルトの名無しさん:2015/01/21(水) 11:52:00.61 ID:g6aErnoK
http://qiita.com/kenokabe/items/61d156005c7831c693cd

毛の壁の新作キター

210 :デフォルトの名無しさん:2015/01/21(水) 11:52:53.36 ID:g6aErnoK
>数学で言う「列(sequence)シークエンス、シーケンス」からsequenceであると考えます。そのままだと長いのでseqあるいはsです。

211 :デフォルトの名無しさん:2015/01/21(水) 12:13:50.54 ID:tSYl3nCX
>>208

なるほど。確かにdo内でwhereを使うのはしっくりこない感じあります

212 :デフォルトの名無しさん:2015/01/21(水) 12:26:32.64 ID:tSYl3nCX
ところでkenokabeさんの記事で初めて、Moggiのクライスリ圏の話を知った。

ボトムとか入出力とか積極的に扱いたい、って需要があって…
1. それをうまくやる方法としてモナドが発見されて、実現のために参照透過性の確保が必要になった。
2. デフォルト遅延評価が採用された。

って経緯だと思うんだけど、
遅延評価なしの言語でモナドってどうなの?

213 :212:2015/01/21(水) 12:48:33.18 ID:tSYl3nCX
>>212
違うか、参照透過の為にモナドが必要なんだ。
逆に言うと、モナドを使った結果、(入出力も)参照透過に表現できる。

214 :デフォルトの名無しさん:2015/01/21(水) 13:32:55.89 ID:Oex/ZY2d
????

215 :デフォルトの名無しさん:2015/01/21(水) 13:57:24.11 ID:IlRdpzFj
モナドと遅延評価って直接関係なくないか?

216 :デフォルトの名無しさん:2015/01/21(水) 14:24:07.34 ID:tSYl3nCX
>>215
ないと思うです。
でも Haskell 以外でモナドメジャーじゃないし、どうなのかな、って。

217 :デフォルトの名無しさん:2015/01/21(水) 14:29:33.51 ID:fNn/u+Hw
福島第1原発汚染水、「処理後に海洋放出」 規制委が明文化

218 :デフォルトの名無しさん:2015/01/21(水) 14:47:43.51 ID:tSYl3nCX
ああ。なんか、ちゃんと分かってなかったぽい。。
(>>=)が第一引数に対して正格でないのは何ででしたっけ…

219 :デフォルトの名無しさん:2015/01/21(水) 14:56:08.53 ID:tSYl3nCX
とんちんかんな質問でした、instance定義する側が決めることでしたね…。

220 :デフォルトの名無しさん:2015/01/21(水) 21:25:39.56 ID:abguHzCC
このkenokabeっていうの頭おかしいのと違うか

221 :デフォルトの名無しさん:2015/01/21(水) 23:17:05.40 ID:Vh0iozsQ
ざっくり言うと
遅延評価 → 副作用があるとまずい
その対偶は
副作用無し(≒参照透明) → 遅延評価でも大丈夫
一方副作用は必要
参照透明を保ったまま副作用を扱う仕組みがモナド

>>213で合ってる

222 :デフォルトの名無しさん:2015/01/22(木) 00:01:32.40 ID:yXMo1Viy
>>221
>参照透明を保ったまま副作用を扱う仕組みがモナド

駱駝師匠の受け売りではないが、参照透明を保ちつつモナドで
隠伏的に世界状態を受け渡すのがHaskellのIOのコツなんで、
普通の言語で「副作用」と呼ばれるものを、世界→(値,世界)な
関数としていわば「主作用」にしているというべきではあるまいか。

つうかだな、この観点からは手続き型言語の手続き自体が、
計算機の状態から計算機の状態への純粋な関数なんだよね。

223 :デフォルトの名無しさん:2015/01/22(木) 00:29:11.30 ID:FeOaPmA2
>>222
http://qiita.com/camlspotter@github/items/06b3d8af27feedf91cf2
駱駝師匠ってこれのことだよね?

その観点だとそうなので、だからむしろそういう観点で語られるより、
参照透明(同じ式の値はどこでも同じ)という観点から語って、
手続き型言語とは違うことを強調してることが多いと思う。

224 :デフォルトの名無しさん:2015/01/22(木) 00:39:11.17 ID:3m94e4CI
でも手続き型言語でも値を通常とは違う意味にすれば参照透明か

225 :デフォルトの名無しさん:2015/01/22(木) 00:54:14.02 ID:yXMo1Viy
>>223
うーん、値は値でいいんだよ。
同じ引数で同じ関数を呼び出した時に同じ返り値、ってのが守られてればいい。
引数として計算機の状態を明示的に追加すれば、いわゆる手続きも純粋な関数。
そしてこれは実は参照透明。可変な値は実際には計算機の状態を受け取る関数だから。

226 :デフォルトの名無しさん:2015/01/22(木) 00:57:47.95 ID:yXMo1Viy
まあそうか、手続き型観点のからは、mutableな「変数」を
計算機の状態を受け取る関数として理解するのは「通常とは違う意味」なのかもな。
個人的にはそういう関数として理解することが多いので、ズレてるのかもしれん。

227 :デフォルトの名無しさん:2015/01/22(木) 01:13:08.79 ID:J1v0x3Vw
IOを「世界状態」の関数だと思うのは方便みたいなもので、
個人的には命令を表す抽象型だと思っておく方が誤解が少ないと思う
関数だと思うことで目から鱗が落ちる人も居るみたいだから全否定はできないが

228 :デフォルトの名無しさん:2015/01/22(木) 01:59:40.16 ID:yXMo1Viy
>>227
Hoare論理とか手続き型の表示意味論とか考えるとむしろ「世界状態の関数」という理解の方が本筋に思えるのだよ。
命令を表す抽象型、という方が便利な方便に思える(いや確かに1級の値として扱えるし便利なんだが)。

229 :デフォルトの名無しさん:2015/01/22(木) 02:41:58.82 ID:AOQ2U7ss
>>221
どうでもいいけどそれ対偶じゃなくて逆じゃないかと思うのだが

230 :デフォルトの名無しさん:2015/01/22(木) 02:54:10.14 ID:yXMo1Viy
>>229
対偶は「副作用があってもまずくない→遅延評価でない」
逆は「副作用があるとまずい→遅延評価である」
裏は「遅延評価でない→副作用があってもまずくない」

「副作用無し→ 遅延評価でも大丈夫」はこのいずれでもない。

231 :デフォルトの名無しさん:2015/01/22(木) 07:11:06.21 ID:mciTShj5
>>229-230
遅延評価 → 副作用があるとまずい

遅延評価 → 副作用あり → まずい
だからflipして戻すと
副作用あり → 遅延評価だとまずい
で、裏を取れば
副作用無し → 遅延評価でも大丈夫
ということで意味的には逆(裏)のつもりだったけど、
書き方がまずくて対偶だと勘違いした。

232 :デフォルトの名無しさん:2015/01/22(木) 07:29:09.34 ID:yXMo1Viy
>>231
お前さんがしたいだろう主張の正しい定式化は

(遅延評価が採用されている ∧ 副作用がある) → 動作がまずい
⇔遅延評価が採用されている → (副作用がない ∨ 動作がまずい)
⇔遅延評価が採用されている → (副作用がある → 動作がまずい)

だ。これはお前さんの

(遅延評価が採用されている → 副作用がある) → 動作がまずい

ではない。「flipして戻すと」とか最初からできない。
その時点で逆だの対偶だのと関係なくなってるわ。

233 :デフォルトの名無しさん:2015/01/22(木) 07:59:21.85 ID:hihrfS9D
>>231のカッコの付け方もそれと同じだよ?

234 :デフォルトの名無しさん:2015/01/22(木) 08:20:28.03 ID:yXMo1Viy
>>233
それなら「flipして戻す」とかできないだろ。
前2つは「→」で結合されてないんだからな。

235 :デフォルトの名無しさん:2015/01/22(木) 08:24:04.14 ID:gOPwVEDJ
>>234
flip :: (a -> (b -> c)) -> (b -> (a -> c))
なんですけど…

236 :デフォルトの名無しさん:2015/01/22(木) 08:43:59.72 ID:C1enpK1T
>>220
しぃっ!

237 :デフォルトの名無しさん:2015/01/22(木) 08:45:42.60 ID:7Blthlt5
kenokabeさんはUCLAを卒業してるんだから刃向かうなよ

238 :デフォルトの名無しさん:2015/01/22(木) 08:46:07.01 ID:J1v0x3Vw
>>228
IOを世界状態の関数だと思うと、例外とか並行性で訳分からなくならない?
例えば、mv :: MVar Intのとき、
modifyMVar_ mv (return . (+2))

modifyMVar_ mv (return . (+1)) >> modifyMVar_ mv (return . (+1))
は違う意味だけど、この二つが異なる「関数」だと言うのは簡単じゃない気がする

239 :デフォルトの名無しさん:2015/01/22(木) 09:12:23.26 ID:yXMo1Viy
>>235
ありゃ、そらそうだ。すまんね。だが、それで言えるのは

副作用がある → (遅延評価が採用されている → 動作がまずい)

なので(これは正しい定式だ)、
>>231が「flipして戻す」をしてないってこったね。

240 :デフォルトの名無しさん:2015/01/22(木) 09:14:16.99 ID:yXMo1Viy
ん、ありゃ混乱してきた。
>>231は「flipして戻す」はしてるのか。すまんほんとうにすまん。
眠くてボケてるな。

単に対偶とか逆とか裏とかを取るそういう操作じゃないってだけだ。

241 :デフォルトの名無しさん:2015/01/22(木) 09:28:26.88 ID:m5cyHAPk
いえ、ニュアンスは伝わってますよ。
おかげさまで、遅延評価とHaskell の関わりが解りました。

全域が参照透過だからこそ、遅延評価をデフォルトにできたんすね。

圏論の枠組みで値を扱いたい

Moggi「モナドあれ」

入出力含む全てを参照透過にできた → コンパイラが攻撃的になれるので動作速度も上がった

遅延評価をデフォルトにできた → モジュール性上がった

242 :デフォルトの名無しさん:2015/01/22(木) 09:33:24.41 ID:luu2eUXm
>>239-240
a → b だとまずい = a → (b → まずい)
b → a だとまずい = b → (a → まずい)
は両方とも意味は同じなんだけど、同じ意味に対して書き方が二つあって、
左辺の逆、裏、対偶は違うものになるってことだと思う。

243 :デフォルトの名無しさん:2015/01/22(木) 09:39:51.90 ID:luu2eUXm
>>241
参照透過にしたい & 遅延評価にしたい

副作用の扱いに困る

モナドを使えば良いことに気づく

だよ。

ちなみにkenokabeが圏論とか言ってるのは完全にデタラメだよ。

244 :デフォルトの名無しさん:2015/01/22(木) 09:45:32.68 ID:luu2eUXm
>>242
すまん、これは括弧無しだとさすがにまずかった。
a → (b だとまずい) = a → (b → まずい)
b → (a だとまずい) = b → (a → まずい)

245 :デフォルトの名無しさん:2015/01/22(木) 10:03:41.42 ID:m5cyHAPk
>>243
へええ、参照透過も遅延評価も結果じゃなくて目的だったんですか!

Haskell と圏論の繋がりがわかんないです。
そういえば訳本の教科書には圏論のけの字も出てこないし、Preludeではidも(.)もCategoryのクラスメソッドじゃないし、歴史的にはクライスリトリプルをモナドとして基幹に採用して以来、徐々に圏論を取り入れてきた、って感じなんすかね。

246 :デフォルトの名無しさん:2015/01/22(木) 10:14:15.85 ID:TlerM3mu
圏論は性質を満たすパターンを集めたものだからさ、デザインパターン集みたいなもんだよ。
OOP で言うデザインパターンはイディオムだけど、 Haskell では型クラスとして記述可能にしているという違いはある。
つっても、例えばモナドがモナド則を満たすかどうかみたいにインターフェイス以外に必要なルールはプログラマの責任だけどな。

247 :デフォルトの名無しさん:2015/01/22(木) 10:22:57.72 ID:ZxT+7VDJ
圏論の考え方でつくられた、JavaScriptで動作する純粋関数型プログラミング言語 spinoza (スピノザ)〜その形式的定義と数学的基盤
http://b.hatena.ne.jp/entry/qiita.com/kenokabe/items/61d156005c7831c693cd

248 :デフォルトの名無しさん:2015/01/22(木) 10:28:47.74 ID:m5cyHAPk
kenokabe 氏の記事はちゃんと読めてないけど、「圏論を導入したのは遅延評価が目的って強弁してたら副作用の除去が目的って主張する関数屋さんに絡まれた。はいここ重要」みたいに言ってたような。

実際は両方が重要だったってことね。

249 :デフォルトの名無しさん:2015/01/22(木) 10:38:43.08 ID:y/T1Azr6
>>246
圏論はデザインパターン、ですか。そういう視点は無かった。勉強になります。

250 :デフォルトの名無しさん:2015/01/22(木) 10:53:22.85 ID:C1enpK1T
入力待ちとかしてるアイドル状態間にガベコレ発動させとくことってできないの?

251 :デフォルトの名無しさん:2015/01/22(木) 11:39:34.25 ID:yXMo1Viy
>>250
System.Mem ( performGC:: IO() ) 使えば?

252 :デフォルトの名無しさん:2015/01/22(木) 12:12:33.73 ID:J1v0x3Vw
>>250
-threadedを付けてコンパイルするとデフォルトで0.3秒のアイドル後に自動GC
https://downloads.haskell.org/~ghc/6.10.1/docs/html/users_guide/runtime-control.html#id2622480

253 :デフォルトの名無しさん:2015/01/22(木) 12:16:17.06 ID:yXMo1Viy
お、便利。

254 :デフォルトの名無しさん:2015/01/22(木) 12:25:44.90 ID:vPFLQWei
遅延評価の目的は再帰的データ構造 (再帰関数には遅延評価は必要ない)
xs = 'x' : xs

参照透過の目的はデータ構造を初期化する順序を自由にすること
(関数を定義する順序は元々問題なかった)
xs = foo 'x'
ys = foo 'y'

255 :デフォルトの名無しさん:2015/01/22(木) 15:19:16.52 ID:C1enpK1T
>>252
流石です

256 :デフォルトの名無しさん:2015/01/22(木) 16:51:17.12 ID:JA0C5j9T
お、kenokabe、コメント欄含めてエントリを消しやがったwww
そして別エントリとして同じ内容を投稿かwwww

257 :デフォルトの名無しさん:2015/01/22(木) 22:03:05.55 ID:K0V9CDcS
>>245
圏論をプログラミング言語の理論に応用してその結果を取り入れようという流れと、
圏論の構造を言語内に取り込もうという流れがあると思う。
モナドの場合はMoggiは前者の意図だったんだけど、Wadlerが後者もやった。
後者は比較的最近の流れで、元々は圏論を取り込もうという目的はなかったと思う。
>>246が言ってるのは後者の話で、Haskellに関する前者の話も沢山ある。

258 :デフォルトの名無しさん:2015/01/22(木) 23:32:32.10 ID:+0By/pHu
>>212
クライスリ圏は、名前の通りKleisliという人の研究に基づく。
後に言う Kleisli triple は圏論の一般論の中で整理された。整理された後もしばらくは triple
と呼ばれていたが、複合語を作るときに triple だと困る(字面上意味不明の言葉になりやすい)
ため、MacLaneがモナドという名称を提案した。モナドという名称はライプニッツの単子論から借りてきたものだけど、ただ単に名前を借りてきたというのが実情。
(「カテゴリー」なんかも元々はアリストテレスの哲学に関連する用語の名詞を借りてきたもの。)
ただし、モナドは関手圏における「一般化された半群(モノイド)」とみなせるという事情があり、「モノイド」と音が近い哲学用語として「モナド」が選ばれたというぐらいの意味はある。
以上のことは「圏論の基礎」pp.183-198 あたりをよく読めば判る。そして、この辺のことは数学の内部での動機によって研究されていて、
コンピュータサイエンスとはあまり関連が意識されていなかった。


Moggiは "Computational lambda-calculus and monads" で計算の圏論的意味論を示した。この中で彼は色々な種類の「計算」が
X --> T(Y) という形の「射」として捉えられると主張した。ただし、Tは考えている圏における自己関手。ところで、このような「計算」
の合成可能性を考えると、Tは自己関手であるにとどまらず、モナドであることが要求される。(要点は、T(T(X)) のような「二重の文脈」
を一重つまりT(X) の形に解くことができるかということ)。カルテジアン積を持つ圏を考えるともう少し強い性質が要求されるが、
これが「強モナド」というもの。

Moggiの論文はいくつかの例が取り上げられており、たとえば状態モナドなども扱われている。関数の内部状態のような、数学的には
ちょっと扱いに困るようなものが、Moggiの示した工夫に依ってうまく扱えるということは、「純粋な関数」(従って呼ばれる毎に遷移する内部状態を持たない)
たちとモナドを組み合わせて、「内部状態を持つ関数」などをシミュレートできるということを意味する。

259 :デフォルトの名無しさん:2015/01/22(木) 23:39:27.07 ID:+0By/pHu
>>258
じゃあなんで「純粋な関数」に固執する意味があるのか。

個人的にはあんまないと思うけど、一応

1.純粋な関数であれば(呼び出し回数に応じて返す値が変わるようなことはないので)最適化しやすい(ほんとかなぁ)。
2.最外最左簡約のように、「同じ部分式を何度も評価する」ことになりやすい評価戦略を選んだ場合、もし関数の純粋性が保証されているならば
  「グラフ簡約」のような最適化手法により、良いコードが生成できる(ことがある)。

なんてことはあると思います。じゃあなんで「最外簡約」みたいなマイナーな評価戦略を使いたいかといえば

・無限リスト、例えば [1 ..] みたいのが余裕で作れて表現力が増す。

ぐらいしか思いつきませんが、とにかく「計算の結果次第で配列の長さが変わる」ような計算を、あまり
チマチマとしたコードを書かずにズバッと書けたりして俺TUEEEできるというのがいいんですかね。

まあ頭いい人は放っておくと変なものを作るということなんだと思います。

260 :デフォルトの名無しさん:2015/01/22(木) 23:57:29.31 ID:+0By/pHu
>>259
蛇足。

「最外簡約」は、構文木を根の方から評価しようという評価戦略で、評価の実態からそのように呼ばれている。
一方で、プログラミングする人の気持で、構文木の終端が評価の最後の方にまで遅延されるという印象に基づいて
「遅延評価」とも呼ばれます。

いずれにせよ「遅延評価」をあまり神秘的に考える必要はないです。

261 :デフォルトの名無しさん:2015/01/23(金) 02:43:28.47 ID:9Ll9FhEC
正格評価に対する遅延評価の利点として
停止する可能性がある計算は必ず停止するというのがあったと思うんですが
それはあまり重視されない?

262 :デフォルトの名無しさん:2015/01/23(金) 03:19:59.17 ID:jnn1J11N
そっちのほうが重視されると思う

263 :デフォルトの名無しさん:2015/01/23(金) 11:34:44.27 ID:FG7Cgjgq
停止しない関数って本当に純粋な関数なのか?
無限ループは副作用じゃないか
同じ引数で結果が2通り以上になるのは副作用
なら0通りも副作用ではないか

264 :デフォルトの名無しさん:2015/01/23(金) 11:58:54.97 ID:5jDftkrl
>>263
>無限ループは副作用じゃないか

f(n) = f(n-1)はたとえば、f(5)=f(4)で、同じ引数なら同じ結果の純粋な関数だ。
単に続けてf(4)も計算しようとするから停止しないだけ。
それが気に入らないなら、停止しないということを「⊥ ボトム」という値で
表現すれば、f(5) = ⊥ は常に成り立つんだからやっぱり純粋性は保たれている。

265 :デフォルトの名無しさん:2015/01/23(金) 13:07:46.09 ID:FG7Cgjgq
⊥はNothingに似てるしMaybeはMonadだから副作用と関係ありそうだけどな

266 :デフォルトの名無しさん:2015/01/23(金) 13:15:42.27 ID:mGGgFMZE
ない

267 :デフォルトの名無しさん:2015/01/23(金) 13:39:39.55 ID:5jDftkrl
>>265
>⊥はNothingに似てるしMaybeはMonadだから副作用と関係ありそうだけどな

そういう適当な連想ゲームしてっとkenokabeになるぞ。

268 :デフォルトの名無しさん:2015/01/23(金) 14:05:12.06 ID:FG7Cgjgq
日本語や英語を使っている時点で同じ穴の狢
だからプログラミング言語がある

269 :デフォルトの名無しさん:2015/01/23(金) 15:05:27.84 ID:mGGgFMZE
何言ってんだおまえ

270 :デフォルトの名無しさん:2015/01/23(金) 16:28:32.03 ID:hSE1K7on
ttp://blog.jle.im/entry/io-monad-considered-harmful

271 :デフォルトの名無しさん:2015/01/23(金) 16:52:38.24 ID:mGGgFMZE
毛の壁マジでQiita潰しそうだな
あんなバカ記事ストックしてる奴らも悪いけど、ある意味すげーわ

272 :デフォルトの名無しさん:2015/01/23(金) 17:49:56.81 ID:he2eREiv
半月くらい前のアレから毛の壁見てなかったけどまだやってんのか…。
少し読んだら前だけじゃなく後ろからも手斧飛んでて笑った。
何がしたいんだよ。

273 :デフォルトの名無しさん:2015/01/23(金) 18:00:53.81 ID:FG7Cgjgq
スパゲッティは上流工程で起きている

274 :デフォルトの名無しさん:2015/01/23(金) 22:03:27.40 ID:psNR2ovj
cabal sandbox init したディレクトリを丸ごとどこかにアップロードし、
それを別のマシンにダウンロードして、そこで元と同じ環境になるようにしたい。

この場合、cabal.sandbox.config ファイルの中に書かれている絶対パスを
それぞれのダウンロード先の環境に合わせて書き直さなければならないの?
たとえば、local-repo: [なんとか]/.cabal-sandbox/packages の値とか。

この [ なんとか] の部分を消して相対パスにしたら、パスが見つからないというエラーが出た。

275 :デフォルトの名無しさん:2015/01/23(金) 22:06:34.99 ID:8zAsCc6J
>>263-269
通常の意味では副作用じゃないけど、
型に⊥を加えるのは全域関数の圏のモナドだよ。

276 :デフォルトの名無しさん:2015/01/23(金) 23:17:22.27 ID:5jDftkrl
>>275
知ってる。リフティング。
しかし、モナドは別に副作用ではない。

277 :デフォルトの名無しさん:2015/01/24(土) 00:19:47.30 ID:FLIgZ7JZ
>>277
全域関数を純粋な関数として他は副作用とする考えもあるし、そういう言語もあるよ。
http://www.rise4fun.com/koka/tutorial

278 :デフォルトの名無しさん:2015/01/24(土) 00:57:27.87 ID:d5sOd2yH
なかなか再帰的な意見だ

279 :デフォルトの名無しさん:2015/01/24(土) 10:35:16.53 ID:ldvaOpkQ
遅延評価って人間が脳内で自然にやっていることをコンピュータのロジックで実装したってこと?

280 :デフォルトの名無しさん:2015/01/24(土) 12:09:46.58 ID:SXwXQLVs
そんなあやふやな話じゃなくて読んで字の如く評価を必要になるまで遅延させるだけの事だが

281 :デフォルトの名無しさん:2015/01/24(土) 12:34:55.72 ID:kvIaPjFB
数学者は一つの式の中の部分式の評価順序ばかり気にしているが
Haskellには無関係な式が二つ以上ある
独立したモジュールが複数存在する
つまり数学者の脳内とプログラマの脳内でやってることが違う

282 :デフォルトの名無しさん:2015/01/24(土) 12:45:49.96 ID:oRbgo8RH
>>281
遅延評価の形式的な議論とプログラマとしての理解にはなにも違いがないし、
君が理解してないだけだと思う

283 :デフォルトの名無しさん:2015/01/24(土) 20:25:38.71 ID:oGAF5m1n
cabal の config ファイルに記述する全項目の意味を解説したサイトはないでしょうか。
英語でもかまいません。

284 :デフォルトの名無しさん:2015/01/25(日) 08:00:31.97 ID:4n+jRXJn
thunkの愚直な考え方が面白い
でも遅延評価ってあんまり実装されてる言語無いんだね

285 :デフォルトの名無しさん:2015/01/25(日) 10:17:56.04 ID:CZVIVtmk
遅延評価がなくなっても計算結果は同じになるか無限ループになるだけ

286 :デフォルトの名無しさん:2015/01/25(日) 10:35:28.00 ID:47J/10kQ
労多くて益少なしだよ。遅延させた方が速くなる場合は多くないし、
正格評価の言語なら遅延評価させたい部分で()->*を渡すだけでいいのだから。

287 :デフォルトの名無しさん:2015/01/25(日) 10:56:39.83 ID:yeeuIM7T
それってcal by name になるだけじゃない?

288 :デフォルトの名無しさん:2015/01/25(日) 11:08:22.84 ID:s2HjDF7w
なるほど。
call by value な純粋関数型言語で、
引数を call by need で渡すのってできるの?

289 :デフォルトの名無しさん:2015/01/25(日) 12:30:43.11 ID:47J/10kQ
メモ化自体は、副作用ありの言語なら1関数渡すだけでいいが、call by needにはできない。
副作用無しの言語ならメモ化も面倒。

けどメリットは少ない。

290 :デフォルトの名無しさん:2015/01/25(日) 13:43:20.57 ID:CZVIVtmk
C「なぜifとwhileは関数ではないのか」
Lisp「関数もマクロも必要だから」Smalltalk「ブロックが必要」Haskell「遅延評価」

291 :デフォルトの名無しさん:2015/01/25(日) 14:45:02.13 ID:yaDwD3P+
>>125
Haskellはイディオムが多すぎる、と思った。
多くのイディオムを身に着けたら効率の良いプログラミングは可能だろうが、
チーム開発は可能なのかな・・。

熟練者を集めても、頼っているイディオムに大きな違いがあるだろうに。

292 :デフォルトの名無しさん:2015/01/25(日) 15:01:30.80 ID:TO6nbIrr
結局負担が記述にかかるか頭にかかるかの違いで
頭への負荷が平気ならイディオム連呼が
そうでないなら正規な表現の組み合わせで表現するのが効率がよい
効率の良さは結局人の性質によって異なるのだ

しかし頭への負担はどんな人間でも年とともにつらくなってくるものだから
将来を考えたらきっちり正規形で考える癖をつけとくべきだな

293 :デフォルトの名無しさん:2015/01/25(日) 23:02:37.58 ID:CZVIVtmk
>>291
Haskellは型とクラスが多すぎる
変数の型と型変数のクラスを自動でチェックしたら効率の良いデバッグが可能
熟練者は頼っている型とクラスに大きな違いがある

>>292
静的型付けの効率の良さは人の性質によって異なる

294 :デフォルトの名無しさん:2015/01/25(日) 23:11:41.00 ID:p3bk5TEE
まず人間を変えないと駄目だ
完全に道具に遊ばれてるな

295 :デフォルトの名無しさん:2015/01/26(月) 13:16:24.01 ID:NLE6CajI
毛の壁アカウント抹消されたのか

296 :デフォルトの名無しさん:2015/01/26(月) 14:14:42.52 ID:rq658b9R
Qiitaって垢BANするんだ

297 :デフォルトの名無しさん:2015/01/26(月) 19:49:58.93 ID:XNIaxWEk
おいおい、それはやりすぎだろ‥ム板のコテ連中と同レベルで ban されるのか?

298 :デフォルトの名無しさん:2015/01/26(月) 20:00:14.82 ID:86moXcK6
片山博xみたいな人畜無害なアホならまあ…

299 :デフォルトの名無しさん:2015/01/26(月) 20:08:46.77 ID:6ykKj8/Z
タグに沿わないポエムは削除、ブロック機能の実装ぐらいが落とし所かと思ってたけど
毛一人をBANってのは何か違うよな
一番簡単な方法ではあるけども

300 :デフォルトの名無しさん:2015/01/26(月) 21:11:30.40 ID:WHjADl5S
>>299
qiitaが毛の壁とやりとりしたが改善されなかったからって言ってたから
あの長文をqiitaに送りつけたんだろう
たぶん注意→凍結→ユーザー資格取り消し
ってやりとりがあったと思われ

301 :デフォルトの名無しさん:2015/01/26(月) 21:20:48.76 ID:AD59R4uG
そろそろネットウォッチでやりたまえ
ここにいるのなら奴のことは忘れろ

302 :デフォルトの名無しさん:2015/01/26(月) 22:45:50.83 ID:1uLj9DBp
スゲー今更だが、これスゲー
http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/

ライブラリ ドキュメントの Data.Data のページに boilerplate へのリンクが貼ってあるが切れてて、探してたら見つかった。

やっと Data 型クラスの使い方がちょっと分かってきた。
仕組みはまだ分からんが。

303 :デフォルトの名無しさん:2015/01/27(火) 00:28:25.15 ID:1sPJsT1Q
まあ宇月って人があらかた周知してくれて解決してくれたらしいね。良かった良かった。

304 :デフォルトの名無しさん:2015/01/27(火) 00:49:25.01 ID:9RKPRbxp
くだらない
一人の敗者を除く全員が平等な世界のどこが良いのか

305 :デフォルトの名無しさん:2015/01/27(火) 00:55:23.26 ID:ON3kwsIb
勝った気になってる奴も負けた気になってる奴もいらねえよ糞タコ

306 :デフォルトの名無しさん:2015/01/27(火) 01:15:28.77 ID:pyp4F36G
毛の壁スレ@ネットウォッチ板
http://yomogi.2ch.net/test/read.cgi/net/1421926957/

307 :デフォルトの名無しさん:2015/01/27(火) 17:27:41.86 ID:+1Xip5ap
>>303
まさか毛も今回のスペシャルフォーメーションにQの運営がゲスト参加してるとは思うまいw

308 :デフォルトの名無しさん:2015/01/27(火) 18:05:56.19 ID:GDvEOGFI
「関数型言語」に関するFAQ形式の一般的説明
http://qiita.com/esumii/items/ec589d138e72e22ea97e

309 :デフォルトの名無しさん:2015/01/27(火) 18:15:19.71 ID:RZorUkzC
>>298
もっとひどいやつがいるぞ
「extern は要らない子!」って今でも連呼しているが、こういうやつこそ ban されないと

310 :デフォルトの名無しさん:2015/01/27(火) 18:44:45.47 ID:ON3kwsIb
そんな奴は勝手に困っとけばいいと思うの

311 :デフォルトの名無しさん:2015/01/27(火) 20:19:19.21 ID:ox5yAQX/
             ,イ    │
          //      |:!
            //,. -/r‐- 、| !
         /,/ ./ |  _」 ト、
       /.\`/  |二...-┘ ヽ
.        i   ,.>、;/ー- 、    l
       ! ∠.._;'____\   |
      ,!イ く二>,.、 <二>`\.、ヽ.
     /'´レ--‐'ノ. `ー---- 、 |\ ヽ、 「forが無いようだが…」
    \  `l  (!"      Jfヽ!  `''-;ゝ
      `‐、jヽ ヾニニゝ   ゙イ" }_,,. ‐''´
         `´\  ー   / ,ィ_}
.          |_ `ー ''´ _」'
        _,.| ~||「  ̄ 人|、._
  ,r==;"´  ヽ ミ|||彡   / ` ー`==、-、
. ///,イ  ___ ヽ|||_,,. ‐''´___  | | | |ヽ

312 :デフォルトの名無しさん:2015/01/27(火) 23:01:22.39 ID:8Es+EE5K
>>311

つ forM_

313 :デフォルトの名無しさん:2015/01/28(水) 07:48:57.72 ID:zESgryfs
このAA良くできてるだろ?
誰の顔だと思う?

         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
   l,、,、,、,、,、,、,、,、,,ー― ':::::::,、,、,、,/,、,、,、,、,`
  /,、,、,、,、,、,、,、,、,、:::::::::::::::::::::::::::、,、、,、,、,、,、,、,、

314 :デフォルトの名無しさん:2015/01/28(水) 08:05:33.60 ID:slxhZiXo
お前のきったねえ顔じゃねえのか
スレ違いも大概にするか、親不知から海に飛び込んで落っ死ねカス

315 :デフォルトの名無しさん:2015/01/28(水) 08:23:42.88 ID:PZUlbwjy
https://twitter.com/_kenron_

関数型bot

316 :デフォルトの名無しさん:2015/01/28(水) 12:11:51.87 ID:1UBwC5Qa
https://twitter.com/_kenron_/statuses/558963343629623296

317 :デフォルトの名無しさん:2015/01/28(水) 12:45:31.15 ID:YDLWOLdX
>>316はネットwatch板のスレに貼られたのと同じタイミングだし、
あっちの同じ人の書き込みを見るとkenokabeに粘着する人のようだし、
このスレもkenokabeに粘着する人に粘着されるのかもしれない。

318 :デフォルトの名無しさん:2015/01/28(水) 14:08:39.14 ID:1WBxC8/8
関数型を使いこなせないのが自己責任というのはまあ分かるが
逆に使いこなせたら全て自分の手柄にしないと割に合わない
でも自分の手柄にしたいなら関数型ではなく自己流でやるべき

関数型が正しいかどうかは知らんが
自己責任論が多かれ少なかれ嘘臭いのはみんな知ってる

319 :デフォルトの名無しさん:2015/01/28(水) 19:27:21.59 ID:GcZv3SAt
スレの雰囲気がなんかおかしい。

320 :デフォルトの名無しさん:2015/01/28(水) 19:28:42.26 ID:D4DppUD9
Haskellは個人的には面白いけど思想に妥協があまり無いのでメジャーになれない感が
ひしひしと伝わってくるw
でも筋はいいのでHaskellの子孫に考え方が継承されればいいと思っている
自分はJavaやScalaでの関数型プログラミングのドキュメントを読んでも
ピンと来なかったがHaskellのドキュメントを読んで少し解った気がする

321 :デフォルトの名無しさん:2015/01/28(水) 19:31:32.93 ID:93RLbcHP
その調子

322 :デフォルトの名無しさん:2015/01/29(木) 06:01:24.39 ID:LrWrINrL
http://imgur.com/a/tiW5S

323 :デフォルトの名無しさん:2015/01/29(木) 08:35:38.22 ID:FGN+iwuI
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ   Qiitaによる圏論弾圧を許すな!
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
   l,、,、,、,、,、,、,、,、,,ー― ':::::::,、,、,、,/,、,、,、,、,`
  /,、,、,、,、,、,、,、,、,、:::::::::::::::::::::::::::、,、、,、,、,、,、,、,、

324 :デフォルトの名無しさん:2015/01/29(木) 08:47:40.40 ID:TTUB+Uno
健論は引っ込んでろ

325 :デフォルトの名無しさん:2015/01/29(木) 10:15:00.02 ID:2lYDg0Ki
自称関数型コミュニティの識者の我々が正してやらねば、みたいな正義感怖い

326 :デフォルトの名無しさん:2015/01/29(木) 11:03:55.08 ID:XWNZF0m4
kenokabe氏、遠隔操作犯・猫好き・ヲタとの相関を語る
http://nmuta.dip.jp/~muta/tog301.pdf

327 :デフォルトの名無しさん:2015/01/29(木) 11:57:00.17 ID:YfwvpXl2
>>325
正義感とか誤解しないでくれ
関数型言語というのは我々は高尚なんだ
ゴミが混じってはいけないのだよ
https://lispmachine.files.wordpress.com/2013/03/chart-dmitry-ignatiev.jpg

328 :デフォルトの名無しさん:2015/01/29(木) 11:58:03.66 ID:CAv4BBBa
関数型コミュニティがHaskellコミュニティではないのは
Haskellが崩壊してもHaskellは真の関数型ではなかったと言い訳できるからだよ
そういうトリックを使ってる自覚のある識者には正義感なんてないだろ

329 :デフォルトの名無しさん:2015/01/29(木) 12:45:27.10 ID:rtImRMnr
Haskellが崩壊という言葉の意味が一ミリも理解できない

330 :デフォルトの名無しさん:2015/01/29(木) 13:57:27.94 ID:zNgdEinm
殺すことのできないキチガイは隔離しないと害悪にしかならない。
「話せば分かる」は最低限のコミュニケーション能力がある相手じゃないと成り立たない。
コミュニケーションとれない人間、威圧的な人間に構うと疲れるだけ。

毛の壁ほどではない、分かりにくい隔離対象もいるから注意な。

331 :デフォルトの名無しさん:2015/01/29(木) 14:32:14.62 ID:4sa11BOV
このスレの隔離対象は分かりやすいぞ
ほんとマジで金払うから死んでくれない?手伝うから
いくら払ったら元のスレに戻してくれる?ニホンゴワカル?

332 :デフォルトの名無しさん:2015/01/29(木) 19:06:49.81 ID:s5T9RiNx
>>331
地の言葉を使いたまえ、君に合わせよう

333 :デフォルトの名無しさん:2015/01/29(木) 20:18:05.22 ID:+HWonkUo
cabal init コマンドで *.cabal ファイルの雛形を作り、いろいろ書き加えました。
その後で、プロジェクトにソースファイルをいくつか追加したので、
*.cabal ファイルの build-dependsに未記入のパッケージがいくつか出てきました。
それらパッケージ名を書き加えたいのですが、*.canal ファイルの更新をサボっていたため、
結構な数があります。

そこで、指定したディレクトリ以下にある *.hs ファイル内で
インポートしているモジュールのパッケージの一覧を得る簡単な方法はないでしょうか。

今の *.cabal ファイルを退避させておいて、改めて cabal init コマンドを使って
適当に *.cabal ファイルを作って、その中の build-depens の項目だけを
先ほど退避させておいた *.cabal ファイルにコピペするのが一番楽でしょうか。

334 :デフォルトの名無しさん:2015/01/29(木) 20:24:13.31 ID:pKGFftLs
私は関数型言語というかHaskellに対して偏見は持ってないよ
最近いろいろと話題になってはいるけど
Haskell使いの人は気にしないのが一番では

335 :デフォルトの名無しさん:2015/01/29(木) 21:01:02.98 ID:3YyToo6+
あなた実はまともだよね。

336 :デフォルトの名無しさん:2015/01/29(木) 21:20:00.38 ID:TKGinLzw
初歩的な疑問だがApplicativeについて教えてくれんか。
<*> [f g h] [1 2 3] = [f(1) f(2) f(3) g(1) g(2) g(3) h(1) h(2) h(3)]
になるようだが、なぜ、
<*> [f g h] [1 2 3] = [f(1) g(2) h(3)]
になるように定義されていないの?

337 :デフォルトの名無しさん:2015/01/29(木) 21:28:27.17 ID:+AdaLcLW
>>336
Identity Law : pure id <*> v = v

が満たされないから。お前さんの提案する定義だと

pure id <*> [1,2,3] =1

になっちまうだろ。

338 :デフォルトの名無しさん:2015/01/29(木) 21:37:09.02 ID:+AdaLcLW
あ、書き間違えてる。

pure id <*> [1,2,3] == [1]

になっちまうだろ、だ。
Identity Lawがわかりにくいなら、
そもそもpure f <*> は fmap f と等価なので、

fmap id [1,2,3] == [1,2,3]

である以上、

pure id <*> [1,2,3] == [1,2,3]

でなければならん、と考えてくれ。

339 :デフォルトの名無しさん:2015/01/29(木) 21:38:09.04 ID:TKGinLzw
>>337
> Identity Law : pure id <*> v = v
そう言うなら、なぜこの規則を課すのがよいの?という疑問なのだが

340 :デフォルトの名無しさん:2015/01/29(木) 21:43:50.38 ID:TKGinLzw
>>338
結局、そうなってるからそうなってる、と理解しろってこと?

341 :デフォルトの名無しさん:2015/01/29(木) 21:51:44.46 ID:+AdaLcLW
>>340
ApplicativeがFunctorである以上、ほかにどうしろと?

つうか、Applicative Lawsを満たすようにApplicativeを実装しようね、
つうのはMonadはMonad Lawsを満たすように実装しようね、
というのと同じ性質のお約束なので、破りたきゃ破れるが、
Functorとしての振る舞いと整合性が取れないそんな糞みたいな型を
作られても使いようがない、というだけのこと。
Applicative Lawsが成立するところにApplicativeそのものの有用性があるんだからな。

342 :デフォルトの名無しさん:2015/01/29(木) 22:06:52.89 ID:TKGinLzw
Identity Law つまり
<*> [id] [1 2 3] = [1 2 3]
は納得したとして、それから
<*> [f g h] [1 2 3] = [f(1) f(2) f(3) g(1) g(2) g(3) h(1) h(2) h(3)]
はどうやって出てくるの?

343 :デフォルトの名無しさん:2015/01/29(木) 22:22:06.70 ID:+AdaLcLW
>>342
気に入る答えとは思えんが、Monadとの整合性から出てくる。
fmap を入れ子で適用した結果の

[[f 1, f 2, f 3], [g 1, g 2, g 3], [h 1, h 2, h 3] ]

に対してjoin(これはリストモナドではconcatのことだ)を適用した
結果と同じにならなければならんので。

344 :デフォルトの名無しさん:2015/01/29(木) 22:33:00.11 ID:+AdaLcLW
あー、というか、お前さんの提案もpureを工夫すればApplicativeには一応できるんだ。
pure a = repeat a と定義すれば、お前さんの提案の<*>でも
pure f <*>と fmap fとを等価にできる。

ただ、それはMonadにするのが困難なだけ。

345 :デフォルトの名無しさん:2015/01/29(木) 22:33:18.98 ID:+HWonkUo
>>340
>>341 さんとは別の視点で説明してみます。

Monad が Applicative なのは分かりますよね。
(Haskell の型クラス的には、歴史的な理由で、そう強制されてはいませんが)
だから、Applicative 型クラスの説明にもこう書いてあります。
  If f is also a Monad, it should satisfy
    ・pure = return
    ・(<*>) = ap
この対応は意味的にもごく自然に見えるので納得できると思います。

リストは Monad なので、[f, g, h] <*> [1, 2, 3] は結局のところ liftM2 id [f, g, h] [1, 2, 3] です。

liftM2 の定義はこうなっています。

liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

この定義も、不思議なところはありませんね。
これを >>= 演算子を使った表記にするとこうなります。

liftM2 f m1 m2 = m1 >>= (\x1 -> m2 >>= (\x2 -> return (f x1 x2)))

リストモナドの >>= 演算子の定義はこうです。

m >>= k = foldr ((++) . k) [] m

つまり、リストの要素を一つ一つバラして、それぞれに関数 k を施し、結果を ++ で繋いでリストに戻す。
リストモナドの >>= 演算子の定義としてはこれまた自然な方法です。

ここまでくれば、[f, g, h] <*> [1, 2, 3] が [f 1, g 2, h 3] ではなく、
[f 1, f 2, f 3, g 1, g 2, g3, h 1, h2, h 3] となるのが自然だと感じるのではないでしょうか。

346 :デフォルトの名無しさん:2015/01/29(木) 22:42:32.79 ID:b9PfoQGR
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ   
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
   l,、,、,、,、,、,、,、,、,,ー― ':::::::,、,、,、,/,、,、,、,、,`
  /,、,、,、,、,、,、,、,、,、:::::::::::::::::::::::::::、,、、,、,、,、,、,、,、

347 :デフォルトの名無しさん:2015/01/29(木) 22:43:16.27 ID:+AdaLcLW
>>342
というわけで、Preludeでのリストモナドと整合的な
Applicativeとしての振る舞いは[f 1, f 2, f 3, g 1, g 2,...]なやつの方だ。
お前さんの提案しているzip風の振る舞いは工夫すればApplicativeにはできる。
それをMonadにしようとすると無限リストに関するなんかのMonadにはできるかもしれんが(確信はない)、
Preludeにあるようなリストモナドとは別の挙動をするMonadになるはず。
なので、お前さんのzip風のやつは標準的なリストモナドに対応するApplicativeの振る舞いではないのは確か。

だがしかし、うむ、お前さんの直観は意外に正しかった気がする。

348 :デフォルトの名無しさん:2015/01/29(木) 23:01:34.47 ID:TKGinLzw
みなさん、丁寧に教えてくれてありがとう。
一気には咀嚼できないのでこのへんでちょっと読み返してみます。
あともうひとつ。Function, Functor, Applicative, Monadと来てるが、
これで一揃い出尽くしているの?

349 :デフォルトの名無しさん:2015/01/29(木) 23:22:32.81 ID:rtImRMnr
>>348
一揃いがどういう範囲を指すのかしらないけど
それらに関連する標準型クラスはまだまだある
typeclassopedia参照
http://snak.tdiary.net/images/20091020_0.jpg

350 :デフォルトの名無しさん:2015/01/29(木) 23:25:29.46 ID:TKGinLzw
> なぜ、
> <*> [f g h] [1 2 3] = [f(1) g(2) h(3)]
> になるように定義されていないの?
こう定義すると、2つの入力の要素数が等しくないといけないという
窮屈な制約がつくのが致命的ということはないの?

351 :デフォルトの名無しさん:2015/01/30(金) 00:13:12.69 ID:q2Om0pvm
そのような定義では、<*>は戻り値にMaybeやEither等を使えない為、長さが一致しない場合はerrorを投げたりundefinedとするしかありません
このような部分関数はerrorやundefinedによる例外というIOモナドを用いないと補足できない地雷を純粋な関数に埋め込む危険な物です
限定的な状況での効率化の為に用いるのは良いと思いますが、Applicativeのインスタンスを部分関数にするのは踏むの間違い無しな地雷原を自ら作るようなものです

352 :デフォルトの名無しさん:2015/01/30(金) 02:22:51.88 ID:UcbP/yFM
リストを「ゼロ個以上の値を返す場合の型」として捉えたら自然に見える。
headとtailに分けて処理して、っていう素直な捉え方だと<*>は奇妙に見えるかもしれん。
そんな場合はApplicativeを使わず書いた方がいいんじゃない?
読む側も書く側も無理矢理な使い方されると困る

353 :デフォルトの名無しさん:2015/01/30(金) 09:18:18.88 ID:gVgHpLV/
>>350,351
そこは別に短い方にあわせれば問題ない。zipと一緒。
この定義でもAplicativeにできることは確認した。

ただ、zipWith ($) fs xs で充分なんで使いドコロがあまりない。

354 :デフォルトの名無しさん:2015/01/30(金) 09:54:25.50 ID:rGzX5MxD
>>353
あの定義だと、
<*>: m(a - >b) ->(ma - >mb) というシンプルな型定義に対して素直でない、
なんていう考え方はないの?

355 :デフォルトの名無しさん:2015/01/30(金) 10:37:10.94 ID:gVgHpLV/
>>354
型定義からは、関数のリスト[a->b]をリスト[a]からリスト[b]への関数にするだけなんで、
素直でないとはいえない。
リストをタプルの拡張みたいなものとして考えればむしろ自然。
ただ、pure x を「ミニマルな無限リスト repeat x」と考える必要がでてくるだけ。

356 :デフォルトの名無しさん:2015/01/30(金) 11:08:34.47 ID:RRvMLdPL
zipはリストの順序を変えると結果が変わるという意味ではシンプルではない
内包表記で書けば (!!) が出てくる
zipWith f xs ys = [f (xs!!i) (ys!!i) | ・・・]

357 :デフォルトの名無しさん:2015/01/30(金) 11:28:37.14 ID:gVgHpLV/
>>356
>リストの順序を変えると結果が変わる

普通のApplicativeだって、結果のリストの順序は変わるから結果は変わるだろ。
非決定性の計算として見た場合にはリスト内の順序が重要ではないとはいえ。
順序対として見た場合に順序が変わると結果が変わるのは当然、というかそうでないと困る。

358 :デフォルトの名無しさん:2015/01/30(金) 11:54:16.82 ID:gVgHpLV/
あ、だいたいzip型のApplicativeの原理を理解した気がする。

[a] は Int -> a な(部分)関数と等価、 [a->b] は Int -> (a->b) と等価なので、
[a->b]<*>[a] の <*> を Int -> a と Int -> (a->b) から Int -> b を合成する関数とみれば、
実はこの <*> は (->)Applicative の <*> そのものになるんだ。
なんで、同様にして(->) Monadと同じような構造を持ったMonadも作れるはず。
ただ、あくまで部分関数なので、そこのところをMaybeと同様に処理してやらなきゃいけないだろうけど。

359 :デフォルトの名無しさん:2015/01/30(金) 12:17:20.65 ID:tKIiSgS/
Control.Applicative.ZipList

join を diagonal とすれば対応するモナドが出る

360 :デフォルトの名無しさん:2015/01/30(金) 12:39:02.10 ID:gVgHpLV/
>>359
>Control.Applicative.ZipList
>join を diagonal とすれば対応するモナドが出る

それだと長さが違うリストの時にdiagonalが取れないのだよ。
各リストの長さを無理やり揃えて足りない分はNothingで埋めるみたいなことをしないといかん。
で、そのNothingを放置できないので最終結果から削ったりとかするとMonad Lawsが破れる……

361 :デフォルトの名無しさん:2015/01/30(金) 14:04:18.96 ID:BdpgM/J/
diagonal [] = []
diagonal ([]:xss) = []
diagonal ((x:xs):xss) = x : diagonal (map (drop 1) xss)
return = repeat
m >>= f = diagonal (fmap f m)

として monad law 破れる?
diagonal ([]:xss) の場合に [] にしないって話?
でも「短い方に合わせる」だと自動的にこれじゃない?

362 :デフォルトの名無しさん:2015/01/30(金) 14:35:06.50 ID:rGzX5MxD
<$>: (a -> b) -> (ma -> mb)
<*>: m(a -> b) -> (ma -> mb)
>>=: (a -> mb) -> (ma -> mb)
と来たわけだがが、
?1: (a -> b) -> (a -> mb)
?2: (a -> b) -> (ma -> b)
?3: m(a -> b) -> (ma -> b)
?4: m(a -> b) -> (a -> mb)
?5: (a -> mb) -> (ma -> b)
?6: (a -> mb) -> (a -> b)
?7: (ma -> mb) -> (a -> b)
はなんか意味あるの?

363 :デフォルトの名無しさん:2015/01/30(金) 15:10:14.28 ID:RRvMLdPL
?1 = (pure .)
?4 x y = x <*> pure y
2,3,5,6,7は m a -> a を含意するっぽいのでダウンキャストのように型が無意味になる

364 :デフォルトの名無しさん:2015/01/30(金) 16:31:41.69 ID:J8sbmrGf
Haskell Data Analysis Cookbookって買っても損しない?
Kindle版 2422円なんだけど

365 :デフォルトの名無しさん:2015/01/30(金) 18:06:14.49 ID:skYnsWRx
サンプル見たところ悪くなさそうだし、まともっぽい人が書いてるからいいんじゃないの?
ただ版元のPacktはGitHub上の有名プロダクトのcontributorに無差別で執筆依頼メールを送るスパム出版社だから要注意

366 :デフォルトの名無しさん:2015/01/30(金) 20:36:40.11 ID:Muu2OiOR
>>364
俺は kobo で電子書籍を買ってしまったんで、アドバイスしよう。

そうとう後ろの方のページまで進まないと、あまり得るものはないと正直感じた。
買う前に目次をよーく見て、本当に興味あるタイトルが何個あるか数えてみてくれ。

あくまで cookbook なんで、原理の説明はない。
お題が出されて、それを行うコードが並び、最後に「何を行っているか」を文字で説明する。
それだけだ。
「なぜそうしたのか」の説明や、他のコードとの比較、コードのブラッシュアップなどはない。

また、示されているコードは全体的に手続き的なものが多い。
関数型特有の宣言的なコードはほとんどお目にかかれないと思っていい。

最後に、全体的に、Webで探せばすぐ見つかるお題が多い。
だから、買う前に目次の各項目でググってみることを勧める。
それで興味あるタイトルの実装方法が理解できれば買う必要はない。


そういうことなんで、知りたいことが数多く目次にピンポイントにあって、
いちいちネットで探すのも面倒で、実装方法も洗練されてなくていいから、
と言うのなら買ってもいいかな、という程度の本かと。

それでも、一通り目を通したら売りたくなると思う。
だから買うにしても、この本に限っては電子書籍はやめとけ。

俺はこういう経験は初めてだから、勉強代だと思って後悔しないことにした。

367 :デフォルトの名無しさん:2015/01/30(金) 21:27:21.61 ID:6lVvNn2h
じゃあやめます

368 :デフォルトの名無しさん:2015/01/30(金) 22:55:28.43 ID:Muu2OiOR
みんな、コンパイル時は -Wall オプション付けような。

widths :: [a] -> [[a]] -> [Int]
width hs [] = ・・・
widths hs ess = ・・・

バグの根本原因がこの手の過ちだったことに気づくのに数時間かかった。
これでもコンパイルは何の問題もなく通ってしまうからな。

他にも、-Wall で発見できるくだらないバグはいろいろあると思う。

369 :デフォルトの名無しさん:2015/01/30(金) 23:24:34.77 ID:RRvMLdPL
パターンマッチと再帰は、関数定義の構文だけでなんでもできるアピールだよね
その代償として関数名を連呼しなければならない

370 :デフォルトの名無しさん:2015/01/31(土) 01:01:40.32 ID:V1osBC+h
ghcmod もいいですよ

371 :デフォルトの名無しさん:2015/01/31(土) 01:29:18.35 ID:LJmJpMKu
ガード使ってもええんやで

372 :デフォルトの名無しさん:2015/01/31(土) 10:35:01.41 ID:tp4m2468
488 Ken Okabe 2015/01/31(土) 08:43:42.15 ID:6mdHEua90
やれやれ、下人が何やら大はしゃぎの様子だが、ぼくからすればこれは「してやったり」であってだね。
Qiitaのアカウントを消されたのは「想定内」。
おまえらの「愚かな成功体験」だな? Qiitaの運営はおまえらの存在を知らないからね。
風評に丸め込まれた点については否定しない。こういう怒りってなかなか伝わりにくいんだ。

しかしね、こういう事例がある。
http://qiita.com/esumii/items/ec589d138e72e22ea97e

少々稚拙な部分はあるものの、おおむね健全なエントリだ。
こうゆうう流れはさ、ぼくのエントリの数々(ストック数は今もなおトップクラス)が無かったら、
生まれてこなかったのさ。
「議論が議論を呼びこむ」ためには、少々過激な言葉や挑発的なタイトルも必要なスパイスなわけ。

これこそがぼくがリスペクトする「Think different」。
Think differentで何が悪い?Think differentで誰が死んだ?

「Think differentでQiitaに活気がもたらされた」。

おまえらの計算通りにはいかない。クズ

373 :デフォルトの名無しさん:2015/01/31(土) 11:26:23.94 ID:r2W96dEs
機械ではなく人を計画通りに動かすことばかり考えている
その結果が、機械は大爆発するが人はアンダーコントロールとかいうディストピア

374 :デフォルトの名無しさん:2015/01/31(土) 11:29:57.05 ID:29y+W13d
毛語録貼ってる奴トリップ付けてくれない
もしくは住所教えろ
二度と指と口が使えないようにしてやる

375 :デフォルトの名無しさん:2015/01/31(土) 12:07:39.93 ID:Klh2e7Hk
権威を否定するようなこと書く割に、権威を借りた記事を書くのはなあ
何かに敗れた事でもあるのか

376 :デフォルトの名無しさん:2015/01/31(土) 12:20:34.48 ID:r2W96dEs
仮定を否定するために仮定を借りる背理法を認めるか否か

377 :デフォルトの名無しさん:2015/01/31(土) 12:33:59.84 ID:tlLNvvFe
>>376
それはありだ、つまり相手の力を利用して背負い投げをかける、というやつだ

378 :デフォルトの名無しさん:2015/01/31(土) 12:48:19.54 ID:tnaZDtOU
駱駝師匠のエントリ全部をベットして得たものが、それ…?

379 :デフォルトの名無しさん:2015/01/31(土) 13:27:09.81 ID:wv2lcnXa
反応するのやめろ

380 :デフォルトの名無しさん:2015/02/01(日) 19:06:21.16 ID:vd3vYCPC
岡部健は一石投じた。

381 :デフォルトの名無しさん:2015/02/01(日) 21:38:09.55 ID:BR+DKYut
投げたのは石じゃなくてウンコだけどな

382 :デフォルトの名無しさん:2015/02/02(月) 00:46:22.38 ID:ygtetN3u
一石投じたかもしれんが、具体的に何しろと。衒学的な話はプログラム書くときに
関係ないというのは確かなんだから。

383 :デフォルトの名無しさん:2015/02/02(月) 07:44:40.16 ID:NKcmyih9
岡部さんの悪口やめろよてめえら。
おまえら嫉妬してるだけだろ

384 :デフォルトの名無しさん:2015/02/02(月) 07:55:04.28 ID:+z6Wv4m/
 発 者 同         . 。_   ____           争
 生 同 .じ     .    /´ |  (ゝ___)          い
 .し 士 .レ      .__/'r-┴<ゝi,,ノ   ro、      は、
 .な で .ベ      ∠ゝ (ゝ.//`   ./`|  }⌒j
 .い し .ル        } ⌒ /`ヽ、_∠l,ノ ・ヽ´
 .! ! か の       /  ´..:.} >、、___,  .r、 ソ、`\
             /   ..:.:.}   /   |∨ ` ̄
            /   ..:.:./    |   丶
           / _、 ..:.:.:.{    .{.:.:.   \
          {   ..:Y  .ゝ、   {.:.:.:.:.    ヽ
          |、  ..:/ 丿 .:〉   >.- ⌒  .  ヽ
          / {. ..:./ ソ ..:./  .(    ..:.:.:`  ..:}
         ./..:.:}.:.:./ ヘ、 ..:./   .\ ..:.:r_,ノ、.:.:}
        ./..:.:/|.:/   {.:./     X.:.:}.}   X X
        /..:.:/ .}.:|    }:/       .Y丶ヽ  Y.:Y
  . __/.:/ { }  《.〈、     _,,__>.:》丶   Y.:\
  /.:.:.:.:.::/   !.:.:ゝ  ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ   \.: ̄>

385 :デフォルトの名無しさん:2015/02/02(月) 08:04:48.29 ID:rJw1gGUc
それより、ここで話をするのを止めていただきたいのだが。
Haskellに触れるのも金輪際やめて欲しい。

386 :デフォルトの名無しさん:2015/02/02(月) 08:23:10.21 ID:0Fbz8OCq
岡部氏は早すぎただけ。彼も標榜していたが、Think different が彼のポリシーだし、
頭がちがちの保守派には嫌われるだろう
Qiitaの運営含め。

387 :デフォルトの名無しさん:2015/02/02(月) 10:50:51.39 ID:e5vtqmbM
あんなのは何も'think'してない
人工無能がやることと同じ

388 :デフォルトの名無しさん:2015/02/02(月) 11:01:50.86 ID:H9q5ynrK
バリバリの関数プログラマにききたい。
Monadってほんとにそんなにうれしいものなの?
ちょっとしたプログラム技法にしか見えないんだが

389 :デフォルトの名無しさん:2015/02/02(月) 11:04:07.15 ID:wLKbauU8
うれしいよ
そうだよ

390 :デフォルトの名無しさん:2015/02/02(月) 11:57:56.69 ID:/f/SzpPp
同じコードを違う型で共有する技法
スクリプトのように型がなければいらないけど型があれば急に価値が上がる技法

391 :デフォルトの名無しさん:2015/02/02(月) 11:58:22.91 ID:Z/2OEvZe
>>387
おまえhiruberutoだろ?死ね

392 :デフォルトの名無しさん:2015/02/02(月) 12:03:30.76 ID:rJw1gGUc
お前が100万回死ねクソカス
居所白状しろ
殺す

393 :デフォルトの名無しさん:2015/02/02(月) 13:26:26.64 ID:QDSUpXSJ
諸君、議論したまえ

394 :デフォルトの名無しさん:2015/02/02(月) 13:38:34.39 ID:H9q5ynrK
>>390
もう少し具体的に

395 :デフォルトの名無しさん:2015/02/02(月) 21:57:16.68 ID:p+nI3cfL
C++
template <template <typename T> class M, typename A>
M<A> join(M<M<A> > x) {return bind<M, M<A>, A>(x, id<M<A> >);}

Haskell
join x = x >>= id

396 :デフォルトの名無しさん:2015/02/03(火) 06:22:05.18 ID:h89g7l/U
>> 390
>> 395
それってむしろ型クラス(と型推論)の手柄なんじゃ…

モナドって何が便利なんだろうね
俺はモナドという構造がプログラミング言語の中に案外たくさんあるから
型クラスを使って共通のインターフェースを与えることにしたみたいな解釈だけど

397 :デフォルトの名無しさん:2015/02/03(火) 07:38:02.39 ID:h23XZm3t
http://stackoverflow.com/users/1028880/ken-okabe

398 :デフォルトの名無しさん:2015/02/03(火) 07:48:06.09 ID:uSJof6v6
http://qiita.com/sct/items/495a324743627c17e8bd
コメント指摘が不毛だと理解して指摘エントリを書く方向に移行したんだろうが
いい加減こいつも精神病臭い

399 :デフォルトの名無しさん:2015/02/03(火) 10:06:10.15 ID:HN01ei1R
http://stackoverflow.com/questions/27980706/javascript-function-composition-by-chaining

コメントが・・・・・

400 :デフォルトの名無しさん:2015/02/03(火) 10:35:21.65 ID:QQGs8hUK
毛の壁にHaskellスレが潰される、、、ギギギ

401 :デフォルトの名無しさん:2015/02/03(火) 11:34:05.28 ID:TZB29Y9v
流行らない理由がよく分かるわ

402 :デフォルトの名無しさん:2015/02/03(火) 13:16:42.41 ID:BnkH9b9q
動的型付けが流行る理由、あるいは静的型付けの壁

403 :デフォルトの名無しさん:2015/02/03(火) 15:33:40.99 ID:7Y38tVHL
>>396
それで合ってるで

404 :デフォルトの名無しさん:2015/02/03(火) 15:58:09.25 ID:eQSyEZGw
人間が型名を書きIDEがメソッド名を補完するやり方はtemplateのせいで行き詰まった
逆にメソッド名を書き型名を補完するのが正解だ

405 :デフォルトの名無しさん:2015/02/03(火) 18:46:44.98 ID:OMwCp+uV
すごいH本読んでて引っかかったんだけど

f1 . f2 . f3 $ f4 x
f1 $ f2 $ f3 $ f4 x

は結果は同じだけど
. の方はf1, f2, f3を合成してその関数にf4 xの結果を引数として渡す
$の方はf4 xの結果をf3に引数として渡してその結果をまたf2に引数として渡してその結果をf1に渡す

っていう認識てあってる?

406 :デフォルトの名無しさん:2015/02/03(火) 19:41:27.86 ID:3jCOO4gf
イメージはそんな感じ

infixr 9 .
infixr 0 $
数字の大きい順に、この場合右側にある演算子から適用される

407 :デフォルトの名無しさん:2015/02/04(水) 10:07:17.90 ID:hySE26ts
a $ (b $ c)
は左の $ から適用されるように感じるのですが病気ですか

408 :デフォルトの名無しさん:2015/02/04(水) 10:45:04.37 ID:nepGnRhU
>>396 >>403
> モナドという構造がプログラミング言語の中に案外たくさんあるから型クラスを使って共通の
そういう共通構造ってモナドやアプリカティブの前にはどんなのがあったの?
それはもう出尽くしたの?それともまだあるの?
そもそも、出尽くしたかまだあるかというのはどうやって議論できるものなの?

409 :デフォルトの名無しさん:2015/02/04(水) 11:57:57.66 ID:u3Xbp/MM
圏論ではとりあえずFunctorと互換性のある型クラスしか想定してない

410 :デフォルトの名無しさん:2015/02/04(水) 12:37:15.03 ID:jjGZkBtH
kenokabe氏、遠隔操作犯・猫好き・ヲタとの相関を語る
http://nmuta.dip.jp/~muta/tog301.pdf

411 :デフォルトの名無しさん:2015/02/04(水) 19:14:52.43 ID:m3L0Q0jh
regex-tdfa と regex-tdfa-rc の違いは何でしょうか。

rc の方はなぜ fork されたのか説明したサイトはあるでしょうか。

412 :デフォルトの名無しさん:2015/02/04(水) 19:15:30.17 ID:acvc5+Js
つ Arrow

413 :デフォルトの名無しさん:2015/02/04(水) 20:46:25.51 ID:KyFvIE+Z
>>383
Haskellで組み込みとか思考してた岡部究さんと誤認してほしくないので
フルネームで岡部健と書いて欲しい

414 :デフォルトの名無しさん:2015/02/04(水) 21:44:46.77 ID:fXvep0kf
いつまでこのスレは岡部熱にうなされるのだ

415 :デフォルトの名無しさん:2015/02/04(水) 21:58:04.00 ID:E92Eb1xr
もちろん死ぬまで

416 :デフォルトの名無しさん:2015/02/04(水) 22:49:29.08 ID:Deq+RQ93
[´・_ 岡部の文章一行も理解できなかったぽよ

417 :デフォルトの名無しさん:2015/02/05(木) 00:48:41.41 ID:gLl3//bv
岡部さんjavascriptばっかでhaskellコードなんか書いてなかったし
このスレじゃなくてjavascriptのスレとかの方が相応しいんじゃないか

418 :デフォルトの名無しさん:2015/02/05(木) 08:47:29.80 ID:hD7mBKMO
あの人はまじで精神科の世話になる必要がある

419 :デフォルトの名無しさん:2015/02/05(木) 15:46:53.66 ID:m9FY3Zyg
>>416
tanakahさんのなりすまし死ね!

420 :デフォルトの名無しさん:2015/02/05(木) 18:45:12.27 ID:1JCfxVIb
なにんもできない〜なんにもできない〜

421 :デフォルトの名無しさん:2015/02/05(木) 18:53:28.45 ID:blaXaOuC
@各位

Haskellで組み込みとか思考してた岡部究さんと誤認してほしくないのでフルネームで岡部健と書いて欲しい

422 :デフォルトの名無しさん:2015/02/05(木) 19:02:47.33 ID:hSWQ8bee
書くなよ
殺すぞ

423 :デフォルトの名無しさん:2015/02/05(木) 19:11:56.01 ID:FbWxCKGC
岡部究さんよりmasterqさんのほうが有名

424 :デフォルトの名無しさん:2015/02/05(木) 20:33:01.70 ID:qP5yT/o/
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ   
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
   l,、,、,、,、,、,、,、,、,,ー― ':::::::,、,、,、,/,、,、,、,、,`
  /,、,、,、,、,、,、,、,、,、:::::::::::::::::::::::::::、,、、,、,、,、,、,、,、

425 :デフォルトの名無しさん:2015/02/05(木) 20:44:40.03 ID:4UwWdyPZ
 「トモダチ作戦に参加した原子力空母ロナルド・レーガンは三陸沖で、3月13日、福島第一1号機爆発による
放射能プルームの直撃を受けた。空母は金属味を伴う生暖かい雲に包まれたが、飛行甲板では作業が続けられた」。
1月31日都内で開かれた「被ばく学習会」の呉東(ごとう)正彦弁護士の報告は衝撃的だった。甲板の汚染が一番
酷かったが、除染作業では防護服も付けていなかった。被ばくを知っていた上官はヨウ素剤を飲んだが、一般水兵には
配られなかった。米軍の報告書によれば、約5000人の水兵のうち約2000人に、呼吸器系・消化器系・妊娠異常・
甲状腺がんなど体の異常が出ている。そして、すでに2名の若い兵士が「骨膜肉腫」と「急性白血病」で死亡した。

水兵たちは若者が圧倒的で貧困層が多い。その人たちが放射能でやられてしまった。健康被害を受けると
働けなくなり、医療費を払えなくなる。切羽詰ったかれらがやむなく東電を相手に損害賠償(1200億円の基金創設に
よる補償)を求めて、2012年12月にサンディエゴ地裁に提訴した。最初に訴えたのは、甲板で勤務していた
リンゼイ・クーパーさん。27歳のシングルマザーで「ひどい鼻血・全身倦怠・甲状腺障害」に襲われたあと、
生理が半年に一回になり「不妊」と診断された。その後、「私も同じ」と名乗り出る人が増え、現在原告は239名に達している。

裁判はまだ始まったばかりで、東電側はさまざまな難癖をつけて、裁判の却下・引き伸ばしを画策してきたが、
昨年10月28日に東電の却下申し立てが否定され、米国南カリフォルニア連邦地裁で、本格的審理が始まることとなった。
 「これはもう一つの被ばくで、日本国のどこよりも深刻な放射能被害が米兵の中に出ていることを知ってほしい。
裁判を応援してほしい」と呉東さんは結んだ。

426 :靖国参拝、皇族、国旗国歌、神社神道を異常に嫌うカルト:2015/02/06(金) 10:19:39.33 ID:3Na3mkxM
★マインドコントロールの手法★

・沢山の人が偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法

・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法


偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い


10人に一人はカルトか外国人

「ガスライティング」で検索を!....

427 :デフォルトの名無しさん:2015/02/07(土) 20:42:56.34 ID:jvjYgCCQ
*.cabal ファイルの文法や指定項目についてまとめられているサイトはないでしょうか。

コメントは行頭の -- 以外は認められないのでしょうか。

428 :デフォルトの名無しさん:2015/02/07(土) 22:39:32.12 ID:GsJmtuWs
マニュアル見ろや。
なんで公式なんを見んのや…。

429 :デフォルトの名無しさん:2015/02/07(土) 23:32:03.78 ID:jvjYgCCQ
>>428
公式サイト https://www.haskell.org/cabal/ を見てるのですが、
探している情報を見つけられません。

どのリンクを辿ればよいのでしょうか。

430 :デフォルトの名無しさん:2015/02/07(土) 23:44:05.43 ID:jvjYgCCQ
>>428
やっと見つけました。

公式サイトトップの [User's Guide] から Cabal User Gude のページへ行って、
そこの What's in Package の節の最後にある [developing packages] から
Cabal User Guie: Developing Cabal packages へ行くと、
求めていた情報がありました。

分かりにくいですね。

431 :デフォルトの名無しさん:2015/02/08(日) 10:09:58.72 ID:y5e+HqvL
Cabal User GuideのContentsにCreating packagesがあるから1ステップ省ける

432 :デフォルトの名無しさん:2015/02/08(日) 17:34:23.00 ID:XnSvUQKs
WIKIのHaskellの説明のところをまだみてる程度なのだけど、
関数と言うもの自体がよくわからない。中学生向けの関数の教材とか
をやったほうがいいかんじ?。初歩の数学的知識がないとだめなのかな。

433 :デフォルトの名無しさん:2015/02/08(日) 18:09:59.77 ID:y5e+HqvL
中学校レベルの関数が分かってるに越したことはないけど、丁寧な入門書で、
他の言語の知識を仮定してないやつなら「関数とは何か」から解説してると思う

434 :デフォルトの名無しさん:2015/02/08(日) 18:31:14.58 ID:XnSvUQKs
>>433 レスありがとう。関数とはなにか位がわかってれば前にすすめるのなー。
なんかワクワクしてきた。準備して楽しんでくるよ。

435 :デフォルトの名無しさん:2015/02/08(日) 19:43:34.86 ID:GJ4+6x6Q
大学レベルの集合と写像…は何も知らないと抽象度が高すぎるか
中学や高校までの数学と論理的には独立してる話なのだが

436 :デフォルトの名無しさん:2015/02/08(日) 19:58:40.71 ID:vtzL8Kp1
集合は中高でもやるしベクトル空間とか線形代数は必要なくね?
関数も中学レベルの理解で足りるし

437 :デフォルトの名無しさん:2015/02/08(日) 20:02:25.85 ID:SGYTxz30
中学校で関数習うときの

「あるxに対して、yがただ一つ定まる時、yはxの関数である」

って説明。
関数というものの本質を簡潔かつ的確に捉えていていい説明だと思うんだけど、
大体ノートに文言書き写しただけで、掘り下げられることなく先に進んじゃうのよね

438 :デフォルトの名無しさん:2015/02/08(日) 20:09:34.19 ID:SGYTxz30
×「あるxに対して、yがただ一つ〜」
○「xの値を定めると、yがただ一つ〜」
でした。すまそ

439 :デフォルトの名無しさん:2015/02/08(日) 20:30:14.38 ID:skbJjy5y
なんか値を突っ込むとそれに応じて決まった値を返してくれるびっくり箱
って小学校で教えられたっけな

440 :デフォルトの名無しさん:2015/02/08(日) 21:11:45.53 ID:RjWbtoq/
学校で数学習った時はグローバル変数しか使ってなかっただろ
ローカル変数を知らない人が再帰やλ式を理解できる?

441 :デフォルトの名無しさん:2015/02/09(月) 00:04:53.73 ID:AazwEOnB
?関係なくない。dynamic スコープってのもあるよ

442 :デフォルトの名無しさん:2015/02/09(月) 00:21:56.99 ID:dbXbgnkd
Haskellなら数学で習った関数の定義がそのまま適用できるから、関数型。そんな理解で十分。

で、数学勉強すればいいのか何て思ってはいけない。HaskellやれHaskell。
すごいhaskellとかふつうのhaskellとか買って書いてあることをやればいい。
英語が読めるならRealWorldHaskellがオンラインで読める。

モナドやら圏論を勉強させたがる奴に出くわすだろうが、無視して構わん。邪魔なだけ。
ゲンミツなギロンとやらがしたい馬鹿は放っとけ。

443 :デフォルトの名無しさん:2015/02/09(月) 00:28:40.73 ID:WXDYRMWK
モナド(Haskell)とモナド(圏論)は別問題だしね
オブジェクト指向の為に生物学を始めるようなもの

444 : ◆QZaw55cn4c :2015/02/09(月) 00:43:17.00 ID:/6o1xue1
>>442
そうか‥‥

445 :デフォルトの名無しさん:2015/02/09(月) 01:07:10.43 ID:0cXvK/Rb
>>442
型レベルのプログラミングを弄ろうとすると必要になってくるけどな。

446 :デフォルトの名無しさん:2015/02/09(月) 01:16:46.95 ID:Wxg28sUk
そういう正論だけど話の流れから外れる事書くのやめようよ…

447 :デフォルトの名無しさん:2015/02/09(月) 03:12:39.58 ID:cnpUeik3
だってその話とやらは終わりそうもないじゃん

448 :デフォルトの名無しさん:2015/02/09(月) 07:51:47.11 ID:cxy5oANg
自然な流れで話ができないのはお前の能力の問題だよ
欠陥人間君

449 :デフォルトの名無しさん:2015/02/09(月) 08:20:50.08 ID:S2TfdUS9
いろいろみんなありがと。

すごいHaskellは今日の夜には届くはず。

要するに、とりあえずはじめろ、いきづまったら調べろ
ってことだよな。

はじめるまえに何か必要だったかどうかが気になって
たんだけど、助かったよ。

ブラウザで、勉強する程度のプログラム環境そろえられるようだし
楽になったね。

450 :デフォルトの名無しさん:2015/02/09(月) 08:22:20.34 ID:8SvV/M2E
いえいえ

451 :デフォルトの名無しさん:2015/02/09(月) 09:16:28.20 ID:KO64xtRG
どういたしまして

452 :デフォルトの名無しさん:2015/02/09(月) 10:42:31.95 ID:C/Xqp5ET
モナドによって副作用はどうなったというの?
無くなったの?要らなくなったの?別物になったの?完全に解決されたの?
副作用が関係するモナドって、IOモナドだけ? 状態モナドも? その他の
モナドは副作用と関係ないの?

453 :デフォルトの名無しさん:2015/02/09(月) 11:00:47.06 ID:0cXvK/Rb
明示して引数で持ち回れば純粋な関数、
暗黙に引き渡せば副作用を持つ不純な関数(ないし手続き)。
明示して引数で持ち回る純粋な関数の
引数部分を隠蔽したのがモナド。
だからモナドは手続きと同じ構造を持つというだけ。
リストモナドの非決定性計算を副作用と考えるような「副作用」の定義に拠るなら、
全てのモナドは副作用を扱っている(が、そう考えても別に役には立たない)。

454 :デフォルトの名無しさん:2015/02/09(月) 11:02:59.77 ID:cnpUeik3
>>448
しつこいよ

455 :デフォルトの名無しさん:2015/02/09(月) 11:05:46.42 ID:cnpUeik3
付和雷同の挙句が442
どこが自然な流れだ

456 :デフォルトの名無しさん:2015/02/09(月) 11:30:41.67 ID:C/Xqp5ET
>>453
サンクスだが、まず文章レベルで不明点がいくつかある。一つ一つ聞きたい。

> 明示して引数で持ち回れば純粋な関数、
何を明示?何が持ち回れば?
要するに、型がA->Bなのは純関数と言ってる?

> 暗黙に引き渡せば副作用を持つ不純な関数(ないし手続き)。
型がA->MBなのは不純関数と言ってる?

> 明示して引数で持ち回る純粋な関数の
> 引数部分を隠蔽したのがモナド。
A->MBのMがモナドだと言ってる?

> だからモナドは手続きと同じ構造を持つというだけ。
この後とも関係するが、IOモナドは手続きっぽいが、
リストは手続きではないよね。

> リストモナドの非決定性計算を副作用と考えるような「副作用」の定義に拠るなら、
> 全てのモナドは副作用を扱っている(が、そう考えても別に役には立たない)。
リストをなぜわざわざ非決定性なんて呼ぶの?値が複数あるだけだね?
非決定性計算をなぜ副作用と呼ぶの?純関数は非決定的ではないから、
というなら、「副作用」って「不純」と同義に使っているのかな?

457 :デフォルトの名無しさん:2015/02/09(月) 12:02:04.55 ID:/ejTkxKz
>>452
モナドによって副作用を起こす処理は>>=の中に隠蔽する事が出来た。
>>=の第一引数でどんな副作用を起こすのか指示を出す事が出来る。

>>=は副作用を持つように実装しなければいけない訳ではなく、リストモナドやMaybeやEitherのように処理の構造を表すことも出来る。
そしてモナドは概ね『副作用・状態系』と『処理構造系』に分かれる。

副作用・状態系で代表的なモナドはIO、ST、State、Reader、Writer
処理構造系で代表的なモナドはMaybe、Either、リスト
他にもあるけど、この辺が分かれば分かる

458 :デフォルトの名無しさん:2015/02/09(月) 12:14:14.36 ID:0cXvK/Rb
>>456

> 何を明示?何が持ち回れば?
蓄積引数使って末尾呼び再帰にする場合を考えればわかる。

> 型がA->MBなのは不純関数と言ってる?
そうではない。それだけではそのmは単にbを取る型構築子に過ぎない。
IO bの実体はRealWorld -> (b, RealWorld)という純粋な関数だ。
だが、このRealWorldは隠蔽されており、IOの外側からはアクセスできない。
隠蔽された引数の受け渡しと処理を裏で行い隠蔽し続けるのがモナドの役割。

> この後とも関係するが、IOモナドは手続きっぽいが、
> リストは手続きではないよね。

モナドはいわゆる手続きと同じ構造を持つが、他のものと同じ構造を持つことも妨げられない。

> リストをなぜわざわざ非決定性なんて呼ぶの?値が複数あるだけだね?

数学的な意味での関数は複数の値を直接に返すことはできない。
そこで、A型の値を複数同時に返したければ冪集合P(A)型の値をひとつ返す、と考える。
明示的にP(A)型を扱う計算を書いてもいいのだが、余りに面倒なので
P(A)に対する計算をAに対する計算から組み立てる構造を提供するのが
リストモナドの役割だ。

> 非決定性計算をなぜ副作用と呼ぶの?純関数は非決定的ではないから、
> というなら、「副作用」って「不純」と同義に使っているのかな?

そういう流儀があるというだけの話。
CS研究者でないなら、クライスリ圏の射なので〜云々、とか気にしてもしょうがない。

459 :デフォルトの名無しさん:2015/02/09(月) 12:16:31.84 ID:0cXvK/Rb
継続の問題を考えれば、上で言われている「処理構造系」も「状態系」も
結局は同じことなのだが、まあ余計な話だ。気にするな。

460 :デフォルトの名無しさん:2015/02/09(月) 13:10:07.32 ID:C/Xqp5ET
>>458
> それだけではそのmは単にbを取る型構築子に過ぎない。
えっ、型構成子に過ぎないんじゃないの?

> IO bの実体はRealWorld -> (b, RealWorld)という純粋な関数だ。
「a -> IO bの実体は、a -> (b, RealWorld)という純粋な関数とみることができる」?

> だが、このRealWorldは隠蔽されており、IOの外側からはアクセスできない。
「だが、このRealWorld(=IO)を入力値にもつ関数は文法的に禁止されている」?

> モナドはいわゆる手続きと同じ構造を持つが、
「モナドはいわゆる手続きと同じ構造を持つことができるが、」?

> 数学的な意味での関数は複数の値を直接に返すことはできない。
そう? 値域が直積型の関数でいいんじゃない? ああ後ろに冪集合P(A)型の値
と書いてるけど、これでもいいし。細かくてスマンな

461 :健論:2015/02/09(月) 14:27:13.69 ID:Z8j1LvoC
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ   
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
   l,、,、,、,、,、,、,、,、,,ー― ':::::::,、,、,、,/,、,、,、,、,`
  /,、,、,、,、,、,、,、,、,、:::::::::::::::::::::::::::、,、、,、,、,、,、,、,、

462 :デフォルトの名無しさん:2015/02/09(月) 14:42:55.11 ID:nsz9u5Yh
>蓄積引数使って末尾呼び再帰にする場合を考えればわかる。

これ面白いよね
副作用を排除する代わりに再帰を使ってTuring completeになるんだけど
Turing completeってことは結局なにも排除されていないんじゃないかと

463 :デフォルトの名無しさん:2015/02/09(月) 15:21:18.12 ID:05bgzRUC
> > IO bの実体はRealWorld -> (b, RealWorld)という純粋な関数だ。
> 「a -> IO bの実体は、a -> (b, RealWorld)という純粋な関数とみることができる」?

ちがくね?
そういう書きかたしたいなら,
「a -> IO bの実体は,a -> RealWorld -> (b, RealWorld)という……」じゃね?

464 :デフォルトの名無しさん:2015/02/09(月) 15:42:59.21 ID:C/Xqp5ET
>>463
わかった。
a ->IO -> (b,IO) でもいい?

それで、
結局、モナドによって、副作用はなくなったのあるの?
参照透明性は確保されたのされていないの?

465 :デフォルトの名無しさん:2015/02/09(月) 15:50:01.05 ID:nsz9u5Yh
>>464
イベント駆動と同じ
コールバック関数を作る権限はあるがイベントを起こす権限がないので副作用が起きない

466 :デフォルトの名無しさん:2015/02/09(月) 16:58:51.32 ID:05bgzRUC
>> 464
> a ->IO -> (b,IO) でもいい?

俺は詳しくないから合ってるかわからないけど,
IOって,それだけでは(IO ナントカ にしないと)型そのものじゃないよね?
でもここで仮に書いてるRealWorldというのは「『現実世界全体』を表すデータ」の型なんじゃないのか

467 :デフォルトの名無しさん:2015/02/09(月) 18:19:55.19 ID:0cXvK/Rb
>>460
>値域が直積型の関数でいいんじゃない? ああ後ろに冪集合P(A)型の値
>と書いてるけど、これでもいいし。細かくてスマンな

返ってくる値の個数自体が非決定的なので単なる直積では上手くいかない。
いずれにせよ、リストモナドは冪集合関手に対応しているということを述べたまで。

468 :デフォルトの名無しさん:2015/02/09(月) 18:31:06.00 ID:0cXvK/Rb
>>464
>結局、モナドによって、副作用はなくなったのあるの?
>参照透明性は確保されたのされていないの?

副作用は純粋な枠組によって「表現」されているに過ぎない。
それをあるというかないというかは自由だ。

ZF集合論上にペアノ算術を構築できるところで、
「集合論の中には結局のところ自然数があるの? ないの?」
という問いと似たようなもので、たいした意味はない。

469 :デフォルトの名無しさん:2015/02/09(月) 20:30:54.38 ID:tNNwE3JC
>結局、モナドによって、副作用はなくなったのあるの?
>参照透明性は確保されたのされていないの?
隔離されて実行を後回しにされてるだけだからmainの内側の世界として見れば副作用は起こらない
実行環境含めての話ならそりゃ当然ある
じゃないと何の役にも立たない

470 :デフォルトの名無しさん:2015/02/09(月) 20:42:49.23 ID:C/Xqp5ET
> 隔離されて実行を後回しにされてる
どういうことか教えてくれ。
何から何が隔離されてる? 後回し?

471 :デフォルトの名無しさん:2015/02/09(月) 20:46:45.06 ID:DixNi1JA
>>464
参照透明性は保たれている。副作用は副作用の定義による。

472 :デフォルトの名無しさん:2015/02/09(月) 20:57:42.72 ID:0cXvK/Rb
>>469
>実行環境含めての話ならそりゃ当然ある
>じゃないと何の役にも立たない

side-effectsという概念は個々の特定の意味論の内部でのみ意味を持つ。
実行環境について「副作用」がある、と主張するのは端的な範疇錯誤だ。

473 :デフォルトの名無しさん:2015/02/09(月) 20:57:55.50 ID:NeCNZel9
『計算(computation)』の概念の要件がモナドになることなんだよ。
なので、一つのモナドに対して一つ計算効果というか副作用(?)が伴う。
ていうか、混乱は副作用(side-effect)という用語をつかっているからだ、
計算効果(computational effect)使え。
なんかよくわからん『計算』という概念をとりあえずモナドで定式化
してみましたって話なんだから。

474 :デフォルトの名無しさん:2015/02/09(月) 21:09:45.06 ID:C/Xqp5ET
>>471
> 参照透明性は保たれている
ていうか、純関数でないようにしたので「参照透明性がない」と指摘できなくなった、
というのが正しいのでは?

>>473
計算効果≒副作用というんだから、モナドではもちろん副作用がある、ということね?

475 :471:2015/02/09(月) 21:21:37.44 ID:AXOw0B0d
>>474
なぜ参照透明性が議論できなくなるの?
定義に基づいて説明して。

476 :デフォルトの名無しさん:2015/02/09(月) 21:43:08.57 ID:CiRoFONA
Esqueleto の質問です。

テーブルの列に Haskell の Day 型と Int 型があり、
毎月の合計を出したいです。

そのために、Day 型の値の年と月で groupBy や orderBy したいのですが、
どのようにすればよいでしょうか。

477 :デフォルトの名無しさん:2015/02/09(月) 23:53:37.23 ID:NeCNZel9
>>474
モナドでは副作用はあるかどうかというか、その副作用もとい計算効果を定式化するためのものだよ。
だから、a -> m b 型の関数は何か計算効果(副作用、非決定計算、継続etc...)を持つというのが正しい。

478 :デフォルトの名無しさん:2015/02/09(月) 23:55:35.56 ID:bwEZbR4B
http://jbbs.shitaraba.net/sports/42269/

479 :デフォルトの名無しさん:2015/02/10(火) 00:33:51.16 ID:nZohWp9h
素直にMoggiの1989年からの一連の論文読むのが一番早いな。

480 :デフォルトの名無しさん:2015/02/10(火) 08:56:04.72 ID:SJUUXy/5
例えばチューリング機械は始めに入力を入れたら出力は常に同じだよね
これも参照透明性は保たれてることになるの?

481 :デフォルトの名無しさん:2015/02/10(火) 09:38:20.27 ID:wjh+ePZc
早く読んであなたの感想をきかせてくれよ

482 :デフォルトの名無しさん:2015/02/10(火) 10:15:51.98 ID:nZohWp9h
>>481

いやそらとっくの昔に読んだのでいまさら感想も何も、内容はワリとそのまま
(純粋な関数ならAが値域になるような)様々な計算の様態を

非停止性計算:⊥の追加によるリフティング A∪{⊥}
非決定性計算:ベキ集合 P(A)
副作用:記憶域の集合Sに対して (A × S)^S
例外:(A+E)
継続:結果の集合Rに対して R^(R^A)

などと構成して、関手や対応する自然変換やそういうのをまとめて
Kleisli Triple, Monadとして構成できるよ、というだけの話なんだが。

483 :デフォルトの名無しさん:2015/02/10(火) 10:38:47.68 ID:wjh+ePZc
>>482
まる写しやん。そんなん皆知ってるよ
ここは、あんたの味付けで言う場所やでw

484 :デフォルトの名無しさん:2015/02/10(火) 10:42:59.32 ID:nZohWp9h
>>483
味付けなんかいらんだろ。正確にそのまま読みゃいいだけだ。
プログラム項の表示はKleisli Tripleで与えられるよ、ってだけなんだから。

485 :デフォルトの名無しさん:2015/02/10(火) 11:02:55.54 ID:wjh+ePZc
あんた何でもずっと読んでるだけだろ

486 :デフォルトの名無しさん:2015/02/10(火) 11:42:52.80 ID:wjh+ePZc
>>480
参照透明性ていうのは、式表現あるいは言語についていう性質。
チューリング機械はそういうものじゃないよね(。。。と思うのだが)

487 :デフォルトの名無しさん:2015/02/10(火) 15:46:42.74 ID:9CApkSQv
関数 f が参照透明とは任意の参照透明な式 e に対し式 f e が参照透明

488 :デフォルトの名無しさん:2015/02/10(火) 19:54:14.49 ID:wjh+ePZc
>>487
何言ってるのw

489 :デフォルトの名無しさん:2015/02/10(火) 20:23:30.53 ID:jjYGyJgg
1. IO型のコンストラクタが公開されていたら、副作用を閉じ込めるというIO型の目的は達成できない
2. モナドであることの条件にコンストラクタの隠蔽なんて無い
以上のことから、モナド「だから」純粋関数型で副作用を使える、何てのは世迷い言だと分かる。

コンストラクタが隠された型の中にアクセスする方法として何が許容できるか、という問題があって、
a -> IO bという関数ならいいだろう(>>=, return)、(a -> b) -> (IO a -> IO b)もいいだろう(fmap)、
IO型以外にも色々使えるから共通化しよう(Monad, Functor, Applicative)、って発展してきた。

モナドモナド連呼すんなよ。モナドが存在しなくてもIOは役目を果たせる。

490 :デフォルトの名無しさん:2015/02/10(火) 20:47:16.14 ID:19+gjHNt
実際モナドが出てくる前は別の仕組みでIOやってたんでしょ?
その頃のHaskellは全く知らないけど

491 :デフォルトの名無しさん:2015/02/10(火) 21:01:23.39 ID:Y9PoDGJy
イベント駆動と同じって私言いましたよね
イベントループを公開してもしなくても目的は達成できますよ

492 :デフォルトの名無しさん:2015/02/10(火) 21:13:17.70 ID:mzLpLH75
>>473
計算の概念がモナドになるんじゃなくて、モナド M を使ったときの a -> M b 型の関数に、計算を抽象化して扱うと便利ということ。

493 :デフォルトの名無しさん:2015/02/10(火) 21:15:02.37 ID:mzLpLH75
>>483
>まる写しやん。そんなん皆知ってるよ

あなた以外の人がほとんど理解できてないからこのスレがずっと続いてるんだが。

494 :デフォルトの名無しさん:2015/02/10(火) 21:50:25.53 ID:2TtYwZaS
>>493
おれもそれぐらいは結構な人が知っとると思うぞ。
Moggiは計算の概念というものをモナドで定式化して、計算効果というものはモナドで
取り扱われるものだということになった。それで計算効果と副作用を混同しているから
現在混乱中ということじゃん。

495 :デフォルトの名無しさん:2015/02/10(火) 22:05:15.28 ID:JohjsGmA
昨日質問したのですが、もう少し詳細に質問します。

Esqueleto について質問です。

select $ from $ \r -> do
 orderBy [asc <ここ>]
 groupBy (<ここ>)
 return <ここ>

r が指すテーブルに date (sql) 型の列があるとして、
<ここ>でその年や月だけを指定することはできるのでしょうか?

postgresql で言えば to_char、mysql で言えば date_format による変換です。
(本当は文字列型ではなく数値型で得たいのですが、共通関数がなく、
最大公約数的機能を提供するライブラリでは無理そうなので諦めます)

どこも SqlExpr (Value a) 型が要求される所です。
これが Value a 型だけであれば toGregorian 関数を fmap してみるのですが、
SqlExpr の中なのでそれもできません。

なにか方法はないでしょうか。

496 :デフォルトの名無しさん:2015/02/10(火) 22:13:27.69 ID:wjh+ePZc
>>491
なんか曖昧な言い方だったのでスルーしてた
イベント駆動と今の問題がどう関係するか、すまんが少し説明してくれんか

497 :デフォルトの名無しさん:2015/02/10(火) 22:53:48.05 ID:Y9PoDGJy
イベント駆動をやれば継続がわかる
モナド動物園が嫌なら継続以外は無視していい

498 :デフォルトの名無しさん:2015/02/10(火) 23:40:33.95 ID:wjh+ePZc
>>497
何言ってるの?

499 :デフォルトの名無しさん:2015/02/10(火) 23:43:19.10 ID:FuAhwWmu
状態変化のないプログラムなんて幻想だと言っているのだろう

500 :デフォルトの名無しさん:2015/02/10(火) 23:49:33.22 ID:2TtYwZaS
継続は、もともと継続渡し演算子の型が>>=と似ていたから発見的に
モナドになったんだっけか。あれは確かに他と毛色が違う。

501 :デフォルトの名無しさん:2015/02/11(水) 00:14:34.50 ID:BNTMxspI
>>495みたいなのに誰も答えずどうでもいいモナドの話ばかりするのHaskellerっぽいですね

502 :デフォルトの名無しさん:2015/02/11(水) 00:27:08.75 ID:XbF0Kw7B
答えたくてもそのライブラリは使ってないから分からん

503 :デフォルトの名無しさん:2015/02/11(水) 00:33:23.05 ID:+jnuF4cU
><ここ>でその年や月だけを指定することはできるのでしょうか?
>postgresql で言えば to_char、mysql で言えば date_format による変換です。

よくわからんがpostgresql でもmysql でもwhere句の出番ではないのかね?

504 :デフォルトの名無しさん:2015/02/11(水) 00:39:07.16 ID:4qKDFlQM
HaskellはAltJSに向いていると思う
ライブラリは丸投げして型の話ばかりすればいい

505 :デフォルトの名無しさん:2015/02/11(水) 10:00:45.87 ID:PH3lpTx+
>>503
たとえば下記のテーブル record において amount 列を月毎に集計したいです。

date (date)  amount (integer)
2014-12-05  6
2014-12-21  53
2015-01-18  41
・・・

Haskell の persistent ライブラリのテンプレートで定義したテーブルの型は以下です。

Record
  date Data.Time.Callendar.Day
  amount Int

私が普段使っているのは PostgreSQL ですが、それだと、たとえば次のように書けます。
(他にも様々な書き方があると思います)

select date_part('year', date) as y, date_part('month', date) as m, sum(amount) from record group by y, m;

Hakell の esqueleto ライブラリには groupBy 関数があるので実現できるかと思ったのですが、
なかなかできません。

ちなみに、persistent ライブラリには group by に相当する機能が無さそうです。

506 :デフォルトの名無しさん:2015/02/11(水) 21:35:53.91 ID:zQ7E6eZT
Haskellは概念も解りにくく実用に供さないに何故人々を魅了して止まないのか

507 :デフォルトの名無しさん:2015/02/11(水) 22:22:42.90 ID:4qKDFlQM
RTTIを断捨離できなかったC++の努力不足

508 :デフォルトの名無しさん:2015/02/12(木) 08:57:25.23 ID:un2yYeN8
じゃそろそろ次は、モナドの限界について語ろうか
これはもう何を読んだなんてのは役に立たないだろ

509 :デフォルトの名無しさん:2015/02/12(木) 09:44:01.87 ID:R1haaHt0
>>508
1.モナドではコクライスリ射を表せない。
2.モナドでは扱えず、Arrowでは扱える構造がある。

510 :デフォルトの名無しさん:2015/02/12(木) 13:23:40.75 ID:nS1JglfS
毛の壁どこいったのか知ってる人居ない?
出版化の話、本当だったのかな

511 :デフォルトの名無しさん:2015/02/12(木) 14:10:27.30 ID:FbfONYzU
>>509
具体例もお願いします。

512 :デフォルトの名無しさん:2015/02/12(木) 14:42:57.47 ID:un2yYeN8
やっぱ読むかw
じゃコクライスリ射とArrowの限界もよろしく

513 :デフォルトの名無しさん:2015/02/12(木) 18:16:05.24 ID:euATx8Od
関手と射を比較してもエラーにならない欠陥言語に限界を感じた

514 :デフォルトの名無しさん:2015/02/12(木) 18:49:59.46 ID:IwOzVJKU
>>513
Haskellの話じゃないな

515 :デフォルトの名無しさん:2015/02/12(木) 19:07:53.59 ID:VxBYzqAD
限界を感じたシリーズを頼む

516 :デフォルトの名無しさん:2015/02/12(木) 21:20:12.59 ID:/vHxcq1E
Functor, Applicative, Monadと分かるような分からないようなでいまいち頭に馴染まないんだけどこういうのって実用していく内に慣れるもの?

517 :デフォルトの名無しさん:2015/02/12(木) 21:24:03.68 ID:foplnmKa
チュートリアルいくつか読んでも分からないなら、そういうものと諦めろ

518 :デフォルトの名無しさん:2015/02/12(木) 21:28:18.97 ID:iIxu3vyf
>>516
俺もこれ

すごいH本読めば使えるようになる?

519 :デフォルトの名無しさん:2015/02/12(木) 21:35:34.69 ID:un2yYeN8
>>516 >>518
俺もこの率直な質問への答えを是非知りたい。
よくわかってる人、よろしくお願いします

520 :デフォルトの名無しさん:2015/02/12(木) 21:45:10.69 ID:KWSicAie
そんな難しいものじゃないしすぐ慣れる

521 :デフォルトの名無しさん:2015/02/12(木) 21:51:22.54 ID:MUCqRjWX
本に一通り目を通したらひたすらコード書くべし

522 :デフォルトの名無しさん:2015/02/12(木) 23:41:25.31 ID:5uF1Brmx
「Haskellはプログラミング言語ではない」という主張があってもおかしくないと思う。
そんな主張は、まだ聞いたことがないけれども。

523 :デフォルトの名無しさん:2015/02/13(金) 00:59:16.00 ID:A3Gi/Piy
書いたら慣れた。慣れてからちょっとして便利さが体に染みた感覚があった

524 :デフォルトの名無しさん:2015/02/13(金) 08:06:33.21 ID:AoemimAk
http://airbook.jp/AirSIN/40138

出版化おめでとう

525 :デフォルトの名無しさん:2015/02/13(金) 08:55:04.65 ID:NYzmQwez
>>519
do式とモナドの関係に慣れる
fmapとjoinとモナドの関係に慣れる
コンビネータとモナドの関係に慣れる

526 :デフォルトの名無しさん:2015/02/13(金) 12:29:52.54 ID:xd3XbIQh
慣れろ、慣れろって言うけど、それもなんか頼りないな
もっと気の利いたこと言ってくれんかな
慣れた結果、何がどう見えたとか

527 :デフォルトの名無しさん:2015/02/13(金) 12:41:48.68 ID:3xGLNuZO
いまいち馴染まないなんて聞き方だから
回答も曖昧になる

528 :デフォルトの名無しさん:2015/02/13(金) 14:51:48.25 ID:F6tqu9mt
Haskellで始めるFRP入門
Kindleで誰か出してくれ
499円までなら買う

529 :デフォルトの名無しさん:2015/02/13(金) 14:53:05.59 ID:P1PmZa4b
毛の壁ブームも終焉か

530 :デフォルトの名無しさん:2015/02/13(金) 15:15:54.10 ID:uTTl3Z2w
>>526
慣れた結果ここでの議論は対して意味がないことがよく分かった

531 :デフォルトの名無しさん:2015/02/13(金) 18:04:17.07 ID:H7QLdU03
>>526
こないだも話に上がってたけど、そこらへんの基本的なクラス (のメソッド) はある種の構文みたいなもんだからさ、
馴染む馴染まないとかじゃなくて「そういうもの」としか言い様がないものなんだよ。
圏論的な意味付けはあるにしても、プログラム上でどう使うかってのは感覚でしかない。
感覚で捕めないならどうしようもないと思うぞ。

532 :デフォルトの名無しさん:2015/02/13(金) 19:03:21.60 ID:uBgFBaOB
とりあえず型を合わせるためだけにreturnを使うのをやめればいいんじゃない?
使う側で適宜持ちあげればいい

533 :デフォルトの名無しさん:2015/02/13(金) 19:14:38.14 ID:mocLL0Pr
Dr.パソコン「コンピュータは、習うより慣れろ」

534 :デフォルトの名無しさん:2015/02/13(金) 19:31:37.01 ID:UmC4xcKh
>>526
これ516だとしたらこんな偉そうな初心者久しぶりに見た
一周して感動した

535 :デフォルトの名無しさん:2015/02/13(金) 20:47:07.31 ID:xPIz8exn
偉そうにする能力を活用するには人間から習うしかない
コンピュータに向かって偉そうにしても無意味だし
自分の能力が無意味になる危険な環境に自分で飛び込める者はほとんどいない

536 :デフォルトの名無しさん:2015/02/14(土) 07:14:24.55 ID:1FeZK1b6
駱駝兄貴の言ってたこと本当だったのか・・・・・

毛の壁テックライティング
http://kenokabe-techwriting.blogspot.com/

537 :デフォルトの名無しさん:2015/02/14(土) 09:42:45.44 ID:nmwmE6a/
毛の壁はまだ自分が異常者だと理解してないみたいだね

538 :デフォルトの名無しさん:2015/02/14(土) 10:26:02.68 ID:0ZlnTsnN
異常者は自分がまともだと思ってるから異常者なのだ

539 :デフォルトの名無しさん:2015/02/14(土) 13:22:06.02 ID:DZcH80vK
>>536
最初からそうやって自分のシマで大人しくしてりゃよかったんだよ、奴は。
それなら電車の中で奇声上げてる奴と同じだから、たいした実害はない。

540 :デフォルトの名無しさん:2015/02/14(土) 14:34:42.82 ID:+bNdvInf
私のようなファンも粛々と楽しめばいいだけだしね、期待しているよ

541 :デフォルトの名無しさん:2015/02/14(土) 17:38:51.42 ID:WvrbmW0c
>>536
ここがあの男のハウスね

542 :デフォルトの名無しさん:2015/02/14(土) 18:46:40.12 ID:Uq/j291/
統失かな?

543 :デフォルトの名無しさん:2015/02/14(土) 21:55:24.08 ID:Qr913xpa
おまえらがHaskellで書いたアプリなんかないの?

544 :デフォルトの名無しさん:2015/02/15(日) 00:31:24.02 ID:0xshxCvz
なくてもいい。批判したら負け。批判しない自分は勝ってる。という風潮

545 :デフォルトの名無しさん:2015/02/15(日) 01:28:36.15 ID:878+Ygr5
前スレからやっと追いついたら荒らされていた悲しみ

546 :デフォルトの名無しさん:2015/02/15(日) 11:30:03.75 ID:RqL4UUkJ
最近shelarcyが活動してないっぽいんだけど、どうかなっちゃったの?
あの連載楽しみにしてたのに

547 :デフォルトの名無しさん:2015/02/15(日) 12:27:19.89 ID:+YnK72sf
do構文の糖衣を剥がして本来の式を展開して表示させる関数orライブラリってある?

548 :デフォルトの名無しさん:2015/02/15(日) 13:32:12.30 ID:OItNZOt1
異なるモジュールツリーにある同名のモジュールをインポートするのは不可能でしょうか。

たとえば以下のディレクトリ構造において、

MyApp
 src
  Main.hs
 rest
  Main.hs

MyApp/src/Main.hs ファイルに書かれた関数の QuickCheck によるテストを、
MyApp/teat/Main.hs ファイル内で行いたいとします。
両 hs ファイルともモジュール名は Main です。

この場合、MyApp/test/Main.hs 内で MyApp/src/Main.hs の Main モジュールをインポートしなければなりませんが、
当然 import Main とはできません。
MyApp/test/Main.hs のビルド時に -i オプションで src を指定したとしてもです。

このようなことは不可能でしょうか。
どちらかのモジュール名を変えなければならないでしょうか。

549 :デフォルトの名無しさん:2015/02/15(日) 13:55:32.40 ID:wBiS0f8f
http://kenokabe-techwriting.blogspot.com/

550 :デフォルトの名無しさん:2015/02/15(日) 14:05:49.04 ID:4E0eOoQ3
>>548
別名でインポートしたり特定の関数だけインポートしたりできる

551 :デフォルトの名無しさん:2015/02/15(日) 14:49:52.15 ID:OItNZOt1
>>550
別名でインポートはどのようにするのでしょうか。

インポートしたモジュールに as で別名をつけるのは分かるのですが。
ghc のオプションを import をキーワードにして検索してみましたが、それらしいものは見あたりませんでした。

552 :デフォルトの名無しさん:2015/02/15(日) 20:24:26.84 ID:FfuFe8/j
>>548
import "パッケージ名" Main
これでどうかな

553 :デフォルトの名無しさん:2015/02/15(日) 20:27:13.04 ID:FfuFe8/j
>>552
GHC拡張のPackageImportsでこの構文が有効になるの忘れてた

554 :デフォルトの名無しさん:2015/02/15(日) 22:43:37.52 ID:OItNZOt1
>>553
私の場合はパッケージではなくファイルです。

それでも PackageImports を試してみましたが、
やはりファイル名では機能しませんでした。
もちろん相対パス、絶対パスなどいろいろ試しました。

555 :デフォルトの名無しさん:2015/02/15(日) 23:39:19.63 ID:+UNfo90q
>>554
一つのパッケージには同名モジュールは一つしか存在できない
パッケージ分けるか、モジュール名を変えてTest.Mainとかにするか
(Cabalのtestsuit機能を使うと自然にパッケージを分けられるけど、ライブラリ向け)

556 :デフォルトの名無しさん:2015/02/15(日) 23:41:08.16 ID:UCc7idSH
>>552
モジュール宣言してimport Mainかな

>>554
ネットの情報で横着しないで入門書読みましょう
最初の言語にHaskellを選ぶのはやめましょう(JSは数に入れない)

557 :デフォルトの名無しさん:2015/02/16(月) 00:13:27.53 ID:XZPRSHCG
>モジュール宣言してimport Mainかな
いやそのモジュール名が重複してるんだよ

>ネットの情報で横着しないで入門書読みましょう
こういう処理系寄りの事情が詳しく書いてある入門書あったっけ

>最初の言語にHaskellを選ぶのはやめましょう(JSは数に入れない)
なんで?

558 :デフォルトの名無しさん:2015/02/16(月) 00:45:29.13 ID:eNydMXDW
>いやそのモジュール名が重複してるんだよ
重複させないのは当然だしすでに書かれてるので

>ネットの情報で横着しないで入門書読みましょう
ふつけるあたりから入ればよろしいかと

>最初の言語にHaskellを選ぶのはやめましょう(JSは数に入れない)
一般的な言語共通の概念に加えて独特な構文や難解な概念がある言語を
モジュールを重複させないような共通事項もわからないうちから覚えようとしても迂遠ですから
免許取って最初に買う車にスポーツカーを選ぶようなものでしょう
実際エンスト(モジュール重複)させてますし

559 :デフォルトの名無しさん:2015/02/16(月) 00:59:07.67 ID:XZPRSHCG
>>558
>一般的な言語共通の概念に加えて独特な構文や難解な概念がある言語を
それは大抵の言語に言えることで、Haskellを特別扱いする理由にならんだろ
例えば、クラスを使うオブジェクト指向言語だと、それ関連の言語要素が大量にあったりする
もちろんHaskellにも難しいところはあるけど、総合的に見たら、
例えばJavaと比べてそんなに習得が難しいわけではないと思う

560 :デフォルトの名無しさん:2015/02/16(月) 01:06:24.51 ID:fGaWs66b
>>548を初心者だと決めつけちゃう人初心者っぽい

561 :デフォルトの名無しさん:2015/02/16(月) 01:23:47.08 ID:9WtMuENr
>>559
すでにJavaに慣れてるならいいけどJava相当も使えないうちにHaskellは厳しい
初心者が静的型やモジュール化のような基礎を覚えるのにシンプルな言語を使わずにわざわざ
必要もないのにHaskellを使って難解にする意味なんてないでしょう

562 :デフォルトの名無しさん:2015/02/16(月) 01:31:17.39 ID:HZ3a9vah
pythonから入門するのが良いよ
分かりやすいしhaskellの良い所が取り入れられててhaskellを学びやすくなる

563 :デフォルトの名無しさん:2015/02/16(月) 03:27:20.60 ID:eoKRu0t8
この問題は質問したり調べたりしてる時間で名前をちょちょっと書き換えれば済む話だしな

564 :デフォルトの名無しさん:2015/02/16(月) 04:09:33.63 ID:vEgulV7R
どの言語が簡単とかいうのはない。
単純ならわかり易いかっていうとそんなことはないし、機能が多ければ使い勝手がいいかっていうとそんなこともない。

当人の知識背景やメンタルモデルに強く強く依存する。

言語が何であっても駄目な奴もいるし、どれでも問題なく使いこなせるやつもいる。

565 :デフォルトの名無しさん:2015/02/16(月) 13:04:57.92 ID:Y6hvsGf9
極論と一般論の区別くらいつけようね
教育用にPythonの採用が進んでる現実が何より雄弁

566 :デフォルトの名無しさん:2015/02/16(月) 20:01:09.04 ID:2R4X9DVo
質問の仕方が悪く、皆さんに余計な誤解を与えたことをお詫びします。

>>563 も言われているように、実際はこの質問をする前から、
すでに片方のモジュール名を変えて作業を進めています。

その上であえて質問したのは、将来のためです。
今回のような状況でもビルドできる機能が提供されているのなら、
次回からはそれぼど気にしなくても良くなりますし、
機能が無いのなら気をつけなければなりません。

つまり、機能があるか無いか、という単純な質問のつもりでした。
今思えば、この一言が足りなかったです。
(言っていれば、無い、の一レスで済んだはずです)
すいませんでした。

それで結局のところ、同名でもインポートできるような機能は無い、という結論ですね。

みなさんありがとうございました。


ちなみに今回は、たまたまアプリのソースの方に Model モジュールを作るつもりで、
それのテストプログラムのモジュールも Model にしてみたところ、
そう言えば同名モジュールのインポートはどうするのだろう?
と疑問を持ったということです。

以前までは、テストプログラムの方は ***Test という名前を付けていました。
しかし、test ディレクトリ下にあるものはテスト用であることは分かりきっており、
名前に Test と付けるのは冗長だと思って今回外してみたのですが、失敗でした。

567 :デフォルトの名無しさん:2015/02/16(月) 20:05:37.76 ID:01EauvRn
JavaというかC++でもいいけどOOPが難しい

568 :デフォルトの名無しさん:2015/02/16(月) 20:37:17.58 ID:E3Wb5l2+
Javaは難しいがPythonは難しくないからOOPが難しいというのは嘘だ
本当は静的型付けが難しい

569 :デフォルトの名無しさん:2015/02/16(月) 20:50:35.70 ID:rA4Zqik8
僕は不要な実行時コストが大嫌いだ

570 :デフォルトの名無しさん:2015/02/16(月) 20:55:23.16 ID:3o6cJtsb
習得したといえるラインがわからない
ジェネリックを気軽に使えて寿命の異なるインスタンスを管理できれば十分?

571 :デフォルトの名無しさん:2015/02/16(月) 21:17:39.67 ID:E3Wb5l2+
>>569
変数が嫌いってことか

>>487
関数 f が参照透明とは任意の定数 e に対し式 f e が定数または⊥ か?

572 :デフォルトの名無しさん:2015/02/17(火) 00:19:12.32 ID:hDqD0gSf
>>566
モダンなプログラミング言語には、「階層的な名前空間」という概念がある
大規模開発における名前の衝突という問題は、この名前空間を利用することによって回避できる
名前空間は、たとえば Java ではパッケージと呼ばれ Ruby ではモジュールと呼ばれている
今回のケース(>>548)は、たとえば Java であれば2つのパッケージ src と test を定義すれば、
たとえ2つのパッケージ内に同名のメソッドが存在しても両者を識別できる

そして結論を言えば、残念ながら:
  「Haskell には(Java のパッケージに相当する)階層的な名前空間は存在しない」
となる

573 :デフォルトの名無しさん:2015/02/17(火) 01:07:39.64 ID:qdPyOS6q
「名前空間?ハッシュテーブルでいいだろ」って言えたら簡単なのに
ハッシュテーブルには実行時コストがあるから嫌いとか言うから複雑になるんだよな

574 :デフォルトの名無しさん:2015/02/17(火) 01:32:25.24 ID:S1EZRPwG
>>566
テストのほうのモジュール名を Test.Model として、
MyApp/src/Model.hs
MyApp/src/Test/Model.hs
というように置けばいいことは分かってる?

>>572
何言ってるの?

575 :デフォルトの名無しさん:2015/02/17(火) 07:51:13.18 ID:1FfSFTEJ
>>574
モジュールを階層構造にする方法は知っています。
よく使います。

ただ、私はテスト用のファイルは test ディレクトリに入れるようにしています。
src には実際のアプリケーションを構築する資源(source)しか入れません。

このルールを一貫して採用しているため、Test.Model という解決方法は、
名前の冗長さという点では、***Test という名前にする方法と大して変わりません。

階層に別れて整理されるかもしれないので、その点では若干アドバンテージがあるかもしれません。

今回はもうすでに開発がかなり進んでしまっているので、モジュール階層を変えるのは困難ですが、
リファクタリングの際や次回の検討候補にはします。

576 :デフォルトの名無しさん:2015/02/17(火) 08:38:34.65 ID:6bJVPK1F
>>575
なるほど。それはまともな理由ですね。
cabal を使っているなら
https://www.haskell.org/cabal/users-guide/developing-packages.html
hs-source-dirs: directory list (default: “.”)
Root directories for the module hierarchy.
とのことなので、
src/Model.hs
test/Test/Model.hs
として hs-source-dirs で src と test を指定すればいけるんじゃないでしょうか。

577 :デフォルトの名無しさん:2015/02/17(火) 10:41:13.63 ID:jYoXJw7T
kenokabeはそもそもOOPにも詳しくねえな

578 :デフォルトの名無しさん:2015/02/17(火) 17:06:56.99 ID:LKq4/Itn
今更ながらZipperについて調べてみたんだけど、これただのiteratorじゃない?
なんで微分がどうこうとかやたら難しい言い方されてるんだ?

579 :デフォルトの名無しさん:2015/02/17(火) 19:29:08.52 ID:Dj056jou
>>578
全くiteratorじゃないよ

580 :デフォルトの名無しさん:2015/02/17(火) 23:40:52.40 ID:1FfSFTEJ
>>576
先ほども言いましたが、test ディレクトリ内に Test ディレクトリを置く解決方法と、
test ディレクトリ内のファイルを ***Test.hs とする解決方法とは、
冗長さという点では同程度だと私は思います。

普通はディレクトリの数よりファイルの数の方が多くなるので、
後者の方法はファイル一覧時に若干うるさくなるかも知れません。
そういう意味では、前者の方法の方が有利でしょうね。

581 :デフォルトの名無しさん:2015/02/18(水) 00:45:49.04 ID:MRGBBtoY
>>578
Zipper と Iterator とは比べるものではありません。
どちらもデータ構造に関することですが、全く違います。

Iterator は「アクセス方法」の一種で、全要素を一列に並べて順に辿ります。
たとえばツリー構造の走査(traverse)を考えてみてください。
他のアクセス方法としては、たとえばランダムアクセスなどがあります。

一方、Zipper は「データ構造」の一種で、ある要素を基準に
その前方の構造と後方の構造に分けて管理します。
他のデータ構造としては、たとえばリスト構造などがあります。

アクセス方法とデータ構造を比較する人はいませんよね。
両者は協調するものです。


微分の話は、簡単に言えば、代数的データ型に微分を使うことで、
Zipper 構造が機械的に(記号操作だけで)作れるということです。
(代数的だから微分できる!)

WikiBooks の Haskell/Zippers のページにも解説がありますが、
代数の意味や微分に関しては私は下記のサイトの方が分かりやすいと思います。
http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/
Part3 に微分で Zipper を作る話がありますが、Part1 から順に読んでいくことを勧めます。

582 :デフォルトの名無しさん:2015/02/18(水) 02:35:51.51 ID:FB+byXVa
zipper はデータ構造に対して定まる元のデータ構造と「同型」(全単射がある)なデータ構造です
リストの zipper はリストと同型です

583 :デフォルトの名無しさん:2015/02/18(水) 03:37:31.00 ID:qbjQSZBI
すごHまどマギで遊びすぎてて草生える

584 :デフォルトの名無しさん:2015/02/18(水) 06:41:55.81 ID:1kElE7Pr
>>582
>リストの zipper はリストと同型です
いや同型じゃないだろ
zipperは現在位置という情報を追加で持ってる

585 :デフォルトの名無しさん:2015/02/18(水) 07:11:19.88 ID:ZqtXntve
>>584
だから最初に「「同型」(全単射がある)」と書いたのですが。
>>582のリストと並列に挙げるような書き方はどうかと思いまして。

586 :デフォルトの名無しさん:2015/02/18(水) 09:14:47.60 ID:Gsbbci4D
Zipperについてよくわかんなかったら,すごいHaskell本でも読んだらどうか
そのためだけに買うのがアレだったら,ネット上で該当の章だけ読んだらいいし

587 :デフォルトの名無しさん:2015/02/18(水) 11:52:50.46 ID:FN39RAK5
今北産業
あるデータコンストラクタの引数のうち1個を取り除き
取り除いた位置情報と残りの引数を別のデータコンストラクタで表現する
f*g*h を微分すると f'*g*h + f*g'*h + f*g*h' になるのに似ている

588 :デフォルトの名無しさん:2015/02/18(水) 12:07:04.20 ID:OwiSmH0Z
継続ってなぜモナドにするの?
継続のどこが純粋関数らしくないの?

589 :デフォルトの名無しさん:2015/02/18(水) 15:34:06.59 ID:BspphGEm
積分そのまま積分微分

590 :デフォルトの名無しさん:2015/02/18(水) 18:26:58.91 ID:1kElE7Pr
>>585
リスト[a]とリストのzipper([a],[a])の間に全単射はないだろ

591 :デフォルトの名無しさん:2015/02/18(水) 18:36:53.10 ID:VFL44f37
15歳に除染作業させた疑い 建設会社の専務逮捕へ
日給は3千円

592 :デフォルトの名無しさん:2015/02/18(水) 21:57:55.99 ID:JYKOQ9/a
>>588
モナドクラスには純粋なインスタンスもある
クラスは悪いインスタンスにも良いインスタンスにも機能を提供する

593 :デフォルトの名無しさん:2015/02/19(木) 00:42:49.35 ID:/rXoqLFu
>>588
> 継続のどこが純粋関数らしくないの?

継続の概念そのものは、純粋だよ

実際、Standard ML よ呼ばれる関数型言語では、
型安全で参照透明性がある継続が一部の処理系(SML/NJ)で
実装されている

> 継続ってなぜモナドにするの?

命令型言語における逐次/分岐/反復といった、
一般には「制御構造」と呼ばれる概念を
圏論の視点で構成したのがモナド
継続は制御構造の一種だから、Haskell では
継続をモナドとして扱っているだけ

594 :デフォルトの名無しさん:2015/02/19(木) 01:02:11.59 ID:/ZeWNbkh
>>593
一部じゃない
継続は全ての処理系で簡単に実装できる
pure x = ($ x)
fmap f = (. (. f))
join m = m . pure

595 :デフォルトの名無しさん:2015/02/19(木) 01:14:45.46 ID:/rXoqLFu
>>594
>一部じゃない
>継続は全ての処理系で簡単に実装できる

失礼、SML/NJ で実現しているのは
(動的型付け言語である Scheme や Ruby と同じ)
一級市民としての継続(call/cc)のことね

またよく知られているように
継続渡し(CPS)はプログラミングスタイルだから、
多くの言語で実装できる
(全ての SML 処理系で実装が可能か?それは簡単か?
 に関しては自分は知らないが、
 自分の知る範囲で一級市民としての継続が
 実装されている SML 処理系は SML/NJ だけ)

596 :デフォルトの名無しさん:2015/02/19(木) 14:00:54.47 ID:YjMFfHT0
SML/NJ...大学時代簡易コンパイラを作る演習で習った言語
こいつのおかげで危うく関数型アレルギーになるところだった
Haskellで治った。にっくきSML/NJゆるすまじ

597 :デフォルトの名無しさん:2015/02/19(木) 16:00:21.98 ID:W9L5xQO/
>>593

> 継続の概念そのものは、純粋だよ
純粋なら、小細工しないで、関数プログラミングすればいいのでは?
それとも、命令型言語における逐次のように不純なものなの?

> 一般には「制御構造」と呼ばれる概念を
> 圏論の視点で構成したのがモナド
正しくは「モナドは「制御構造」と呼ばれる概念も構成できる」?

598 :デフォルトの名無しさん:2015/02/19(木) 18:00:01.16 ID:HxD7CCKn
岡部健

599 :デフォルトの名無しさん:2015/02/19(木) 19:15:49.42 ID:ISm5rOHD
Text.Parsecが最新版でText. ParserCombinatior.Parsecが互換性用という認識であってる?

600 :デフォルトの名無しさん:2015/02/19(木) 21:45:42.87 ID:6Gx+ywct
素人の質問だけど
scalazってscalaのライブラリにStackless Scala with Free Monads
って勝手に末尾最適化するっぽい? のがあるんだけど
haskellに似たようなのってないかな?
っていうかhaskellってあんまりスタックレスにするって事あんまり注意しないような気がする(つか末尾再帰にしないほうがいい場合がある?)
んだけどなんでなんだろうか

601 :デフォルトの名無しさん:2015/02/19(木) 23:02:55.08 ID:/rXoqLFu
>>596
つまり Haskell であれば簡易コンパイラは書けるってことね、よかったよかった

まあ言語には相性があるみたいだから、アレルギー過敏な人がいてもおかしくはない
実際、情報工学系の学生で簡易コンパイラ作成程度の演習で苦労するようなのは、
まともに講義を受けていない僅かな落ちこぼれだけだしね

602 :デフォルトの名無しさん:2015/02/19(木) 23:44:17.14 ID:/rXoqLFu
>>597
>> 継続の概念そのものは、純粋だよ

補足しとくと、ここで言う「純粋」とは副作用が無い(= 参照透明性が保証される)という意味ね

>純粋なら、小細工しないで、関数プログラミングすればいいのでは?

たとえば Scheme や Standard ML のように先行評価な関数型言語であれば、
(SML/NJ の callcc のように)何の小細工もせず素直に継続を関数プログラミングできる
ところが Haskell は遅延評価を採用しているから、
継続のような制御構造をプログラムとして明示的に記述したいケースに限れば、
小細工が必要になる


>正しくは「モナドは「制御構造」と呼ばれる概念も構成できる」?

だね、モナドという抽象的な概念は、制御構造という枠には限定されない
とはいえ一言で制御構造と言っても、逐次/分岐/反復という三つの基本構造だけでなく、
ジャンプ(GOTO文)、例外の発生/補足、そして全解探索で用いられるバックトラッキングなど
幅広い応用があるから、それだけでもモナドを学び活用する意義は大きい

603 :デフォルトの名無しさん:2015/02/20(金) 00:42:56.42 ID:QCbNSBwz
>>601
なぜ落ちこぼれの話をしようと思った?
読んでもらうためではなく、読めない者を落ちこぼれさせるために長文書いてるのかな

604 :デフォルトの名無しさん:2015/02/20(金) 01:03:50.60 ID:4c2wlx5K
比較対象で本人の程度も知れる法則

605 :デフォルトの名無しさん:2015/02/20(金) 10:24:25.27 ID:ru8DK82J
岡部健

606 :デフォルトの名無しさん:2015/02/20(金) 10:31:48.93 ID:QCbNSBwz
一部の人だけ生きのこればいいと割り切るのも悪くはないが
生きのこる人はくどくどと説明される前から必要な知識を持っている

607 :デフォルトの名無しさん:2015/02/20(金) 11:12:04.13 ID:kMCMx9Td
>>602

> ここで言う「純粋」とは副作用が無い(= 参照透明性が保証される)という意味ね
OK

> ところが Haskell は遅延評価を採用しているから、
> 継続のような制御構造をプログラムとして明示的に記述したいケースに限れば、
> 小細工が必要になる
ここはよくわからんかった。
小細工が必要になるのは、「遅延評価を採用しているから」なの?
「継続のような制御構造をプログラムとして明示的に記述したいケース」
は純粋ではないからなんじゃないの?

継続って、>>=そのもの?

> モナドという抽象的な概念は、制御構造という枠には限定されない
それだけじゃなくて、いわゆる処理型モナドからデータ型モナドまであまりに広範囲だ。
それは逆にモナドが無意味だということを表してはいないの?

608 :デフォルトの名無しさん:2015/02/20(金) 13:36:57.46 ID:NRgYnesQ
大学でのStandardMLの授業は嫌いだったなあ
なんで関数型なんていうものを使うのかわからないままやらされてたから

学生時代から何か開発するバイトとかしてればいろいろわかってもっと効果的に授業を受けれたんだろうなあ

609 :デフォルトの名無しさん:2015/02/20(金) 14:14:13.73 ID:ZHdyFWS6
関数型言語の考え方を仕事で使うことはないけどな

610 :デフォルトの名無しさん:2015/02/20(金) 17:35:37.51 ID:4TCRV9ZI
関数型というものの空間漏れを避けるため実質末尾再帰でない再帰関数が
書けないのがもどかしいのですがこの点熟練の方はどうされてるのでしょうか?

611 :デフォルトの名無しさん:2015/02/20(金) 18:11:56.28 ID:5PeElh9m
スペースリークと末尾再帰は関係ないよ
手続き型でループ使うところは末尾再帰で書くだけの事

612 :デフォルトの名無しさん:2015/02/20(金) 18:29:32.18 ID:4TCRV9ZI
すみませんスタックと混同してました
スタック溢れに訂正させてもらいます

613 :デフォルトの名無しさん:2015/02/21(土) 00:19:24.05 ID:KgB/c0aN
>>607
>> 継続のような制御構造をプログラムとして明示的に記述したいケースに限れば、

この箇所、間違いではないが誤解しやすいと思われるので、以下のように訂正する
 X: 継続のような制御構造を --> O: 継続を含む制御構造を
>>591 で書いたように「継続は制御構造の一種である」という意味


>小細工が必要になるのは、「遅延評価を採用しているから」なの?

そのとおり
たとえば副作用を伴う関数 f と g を「逐次」的に評価したい時、
先行評価であれば単に逐次関数 seq に 式 f x と g y を適用するだけで、
f x を評価した後に g y を評価するという逐次性が確実に保証できる
けれども遅延評価では(必要になるまで評価が遅延されるから)、
式 seq (f x) (g y) を評価した時における関数 f と g の評価順序は予測できない
だから遅延評価な関数型言語で(命令型言語の)制御構造を表現するには、
何らかの工夫(=小細工)が必要になる


>「継続のような制御構造をプログラムとして明示的に記述したいケース」
>は純粋ではないからなんじゃないの?

>>539 で書いたように、(継続を含む)制御構造は純粋だよ
純粋でないのは制御構造の対象要素であるI/Oや破壊的代入のような命令の部分
命令型言語の制御構造は、フローチャートを思い浮かべれば分かるように
ステートマシン(有限状態機械)としてモデル化できる
そして良く知られているようにステートマシンは純粋な関数として表現できる
(純粋な)制御構造と(純粋ではない)命令とをごっちゃにしてはいけない

614 :デフォルトの名無しさん:2015/02/21(土) 01:26:37.57 ID:KgB/c0aN
>>610-612
まずは以下を嫁:
 ・【アンチ】関数型言語は使えない【玩具】 2
  http://peace.2ch.net/test/read.cgi/tech/1330429547/413-418

Haskell も同じだよ
一般にコレクションと呼ばれるリスト/ベクタ/配列/集合/マップ/ハッシュ表といった
一次元な連続データ構造を扱う場合、それを分解したいなら foldr/foldl を、
組立てたいなら unfoldr を使えば、多くのケースで再帰を用いずコードを書ける
例外的に書けないケースに会ったなら、その時は個別に検討すればいい

まずは foldr/foldl/unfold を自在に使えるようになることから始めませう

615 :デフォルトの名無しさん:2015/02/21(土) 02:45:25.62 ID:XQcKoRVb
>>614
map/filter/foldのほうが手に馴染んでむしろ書きやすいのですが
関数型はアルゴリズムを数学の数式で説明されることがよくあるので
記述の明瞭さもあってこのまま使えないかと思い質問させていただきました
やはりこの種のアルゴリズムの修正は省けないようで地道にやることにします
ありがとうございました

616 :デフォルトの名無しさん:2015/02/21(土) 07:29:08.00 ID:oVc18//y
foldlがゴミだと聞きました!

617 :デフォルトの名無しさん:2015/02/21(土) 09:25:22.70 ID:GeR3Fn9o
第一引数が関数合成ならfoldl、それ以外はfoldl'

618 :デフォルトの名無しさん:2015/02/21(土) 09:29:38.35 ID:rkdK3xe5
たとえば再帰は純粋な概念だが
実装の都合で末尾最適化なんて余分な概念が混ざる
この時点で関数型言語は終わっている

もちろんたとえばCにだって同じ問題は発生するが
言語的にスタックの概念を認めているので諦めがつく

619 :デフォルトの名無しさん:2015/02/21(土) 10:18:36.70 ID:QRTg4MrQ
意味不明なんだけど
関数型になるとスタックの概念を認めてない??

どんな言語だろうと最終的には機械語を機械が実行するのは変わらんのに

620 :デフォルトの名無しさん:2015/02/21(土) 10:52:07.10 ID:vdhVmhIc
コンパイラがf(x)+g(y)をf(x,g(y))に変換してかつ積みあがるg(y)を共有してメモリを圧迫しないようにすればあるいは?

621 :デフォルトの名無しさん:2015/02/21(土) 12:12:42.07 ID:gIj/6adm
callCCで強制的に末尾呼び出しすればいいのかな

callCC :: ((a -> (b -> c) -> c) -> (a -> c) -> c) -> (a -> c) -> c
callCC f k = f (const . k) k

ちなみにコンストラクタを使うとコードが読みにくいし使わないと型が見にくい

622 :デフォルトの名無しさん:2015/02/21(土) 13:01:14.43 ID:43YG5tRb
>>613

> だから遅延評価な関数型言語で(命令型言語の)制御構造を表現するには、
> 何らかの工夫(=小細工)が必要になる
> >>539 で書いたように、(継続を含む)制御構造は純粋だよ

これは、継続(あるいは逐次)が評価順序にセンシティブということであり、
つまりは、継続は純粋ではないということではないの?
それとも、「継続は、>>=によって純粋でないことを明示しているので純粋である」
という変な論法?

> 純粋でないのは制御構造の対象要素であるI/Oや破壊的代入のような命令の部分

命令の部分が純粋でないのはそのとおりだが

> 命令型言語の制御構造は、フローチャートを思い浮かべれば分かるように
> ステートマシン(有限状態機械)としてモデル化できる
> そして良く知られているようにステートマシンは純粋な関数として表現できる
> (純粋な)制御構造と(純粋ではない)命令とをごっちゃにしてはいけない

よくわからん説明だな。
命令型言語の制御構造はステートマシンとしてモデル化できるが、
そのステートマシンは純粋でないものの代表だろ? Stateモナドだってあるくらい。

> 良く知られているようにステートマシンは純粋な関数として表現できる

これ何のこと言ってる?ホントか?

623 :デフォルトの名無しさん:2015/02/21(土) 13:26:02.52 ID:yPuvFC+H
cps変換で末尾再帰

624 :デフォルトの名無しさん:2015/02/21(土) 14:31:44.28 ID:paijIEDQ
>>619
さほど遠くない将来、命令列ではなく回路にコンパイルされる時代がくると思うが。
そのとっきは、手続型(命令型)以外の言語が相対的に有利化も。
手続型言語は、命令列生成に過剰に最適化されているから。

625 :デフォルトの名無しさん:2015/02/21(土) 14:40:05.32 ID:s76k4WVR
?何か、モナド使うと純粋でないと思ってそうな

626 :デフォルトの名無しさん:2015/02/21(土) 14:59:47.22 ID:gwkDhRu5
俺にはモナド以前の問題に見えるが

627 :デフォルトの名無しさん:2015/02/21(土) 15:00:28.18 ID:43YG5tRb
?純粋でないところがモナドの出番だろ

628 :デフォルトの名無しさん:2015/02/21(土) 15:35:12.24 ID:SegQLQC2
>>622
評価順序にセンシティブだから純粋ではない、という論理がおかしい。
純粋な関数を単に逐次評価するだけなら、その間に依存関係があったとしても
全体の参照透過性は損なわれないだろう。

629 :デフォルトの名無しさん:2015/02/21(土) 16:49:55.44 ID:3a3I5RyI
>>627
にも使えるってだけの話だろ

630 :デフォルトの名無しさん:2015/02/21(土) 17:31:01.12 ID:gIj/6adm
これはリファクタリングの議論に似てる
仕様を一切変更することなく実装を変更するのは不可能

同様に、純粋でない道具を一切使わずに純粋な関数を作るのは不可能
ここで道具を使うというのは仕様を使ってるのか実装を使ってるのかで混乱しやすい

631 :デフォルトの名無しさん:2015/02/21(土) 18:10:17.50 ID:43YG5tRb
>>628
純粋な関数には、そもそも、評価順序という概念すらないだろ

632 :デフォルトの名無しさん:2015/02/21(土) 18:32:43.82 ID:XLU71/kI
>>624
回路にコンパイルしてどうやって実行するんだ?
従来型の、メモリに命令を書き込んで、CPUがそれを実行するという
パターンではなくなるとうこと?

633 :デフォルトの名無しさん:2015/02/21(土) 19:09:50.14 ID:SegQLQC2
>>631
というかそもそも、関数がいつ評価されるかというのはその関数自身の性質じゃない。

634 :デフォルトの名無しさん:2015/02/21(土) 20:01:22.24 ID:oZjMervi
評価順序は言語の性質だな

635 :デフォルトの名無しさん:2015/02/21(土) 20:07:58.97 ID:oZjMervi
回路にコンパイルって意味わかんね

636 :デフォルトの名無しさん:2015/02/21(土) 20:22:48.86 ID:qCqW+14K
HDL だの fpga だののことをいっているとすれば、確かに >>632 は周回遅れ
ただGレベル高クロックならフォンノイマンアーキは現時点でまだ有効のようだね

637 :デフォルトの名無しさん:2015/02/21(土) 20:47:06.80 ID:KgB/c0aN
>>622
>これは、継続(あるいは逐次)が評価順序にセンシティブということであり、
>つまりは、継続は純粋ではないということではないの?

「純粋」という用語の意味が「副作用が無い」ことであることは >>602 で示し、
それに対して君は >>607 で「OK」とレスしている
けれども、その認定された事実から今回の:
  「継続は評価順序にセンシティブである。ゆえに継続は純粋ではない」
という推論を帰納するのは、論理的に破綻しているよ
もしかすると >>607 の OK(事実認定) を撤回して、代わりに純粋の意味を
  「副作用が無く、かつ評価順序に対してインセンシティブである」
へと変更したいのかな???

>そのステートマシンは純粋でないものの代表だろ? Stateモナドだってあるくらい。

いや、StateモナドがHaskellの(純粋な)関数として定義できるように、
ステートマシンそのものの定義は純粋だよ
そしてステートマシンのインスタンス定義において:
・遷移関数が主作用(=入力と出力の写像)だけで表現できれば、そのインスタンスは純粋である
・主作用に加えて遷移関数が(I/Oや破壊的代入といった)副作用を伴うならば不純である
ということだ
ステートマシン(のクラス)とそのインスタンスとを、ごっちゃにすべきではない

>> 良く知られているようにステートマシンは純粋な関数として表現できる
>
>これ何のこと言ってる?ホントか?

おいおい、勘弁してくれ ....
まずは以下を嫁:
・関数型言語Part5
 http://peace.2ch.net/test/read.cgi/tech/1252470706/484-500
スレを一通り読んだら、次はスレ#494で指示された Wikipedia のトピックを嫁

638 :デフォルトの名無しさん:2015/02/21(土) 21:21:50.24 ID:43YG5tRb
>>630
>仕様を一切変更することなく実装を変更するのは不可能
嘘だろ
>>633
いつ評価されるべきかはその関数の仕様に依存する
>>634
言語の実装の性質

639 :デフォルトの名無しさん:2015/02/21(土) 21:38:55.94 ID:gIj/6adm
>>638
例えば馬と自動車の仕様が同じと思うか違うと思うかは人それぞれ
だからこそ、一切変更されないなんて言ってはいけないと思う

640 :デフォルトの名無しさん:2015/02/21(土) 21:48:26.24 ID:43YG5tRb
>>637
あなたの副作用の定義を示してくれんか?
もしかしてリアルワールドとのインタラクションだけを意味してる?

641 :デフォルトの名無しさん:2015/02/21(土) 21:50:05.66 ID:43YG5tRb
>>639
いま言ってる仕様って書かれてるものだよん

642 :デフォルトの名無しさん:2015/02/21(土) 22:49:48.44 ID:KgB/c0aN
>>640
すでに>>637 のステートマシンの段落で簡単に書いているけど、念の為に再度書く

まず「副」作用という言葉から分かるように、これは「主」作用の対義語であり:
・主作用とは入力から出力への写像だけで定義される対応関係のこと
(ここで、「入力から出力」を「適用する値から評価結果の値」へと、
 「対応関係」を(関数型言語における)「関数」へと置き換えてもかまわない)
・副作用とは主作用では定義されないあらゆる効果であり、たとえば破壊的代入やI/Oがある
(つまり、関数の評価によって生ずる効果の中で、主作用ではないものすべてを指す)

643 :デフォルトの名無しさん:2015/02/21(土) 23:28:29.54 ID:43YG5tRb
>>642
サンクス。それなら俺の理解とあまり違わないとまずは思うね。
俺の場合は、純粋な関数とそれ以外という区別だが。
同じことをあなたは、主作用とそれ以外と言っていると理解した。
ただ、純粋な関数にはもちろん作用なんてないから、根本的に違うのかもしれん

644 :デフォルトの名無しさん:2015/02/21(土) 23:42:48.38 ID:KgB/c0aN
>>643
では、スマンが「純粋な関数とそれ以外 ....」という節に含まれる
「純粋」の定義を教えてくれまいか?
もちろん循環定義は勘弁してね

循環定義の例:
  「純粋とは副作用が無いという性質であり、副作用とは純粋ではない効果である」

645 :デフォルトの名無しさん:2015/02/21(土) 23:50:49.84 ID:rkdK3xe5
ある入力の組に対してある出力の組が確定するとする
副作用の説明として、ある入力の組に対して複数の出力の組の場合があり、そういう現象を起こすのがIOや破壊的代入とある
IOや破壊的代入を入力の組の一部と考えてはいけない理由を述べればこの場合十分だろうと思う

646 :デフォルトの名無しさん:2015/02/22(日) 00:12:40.99 ID:jAanobMm
>純粋な関数にはもちろん作用なんてないから

この時点でなにか、一般的な定義とは根本的に違っているんだろうなぁ。

647 :デフォルトの名無しさん:2015/02/22(日) 01:03:47.93 ID:qxC/WEu2
評価順序によって、出力が一意に定まらないなら、評価順序も入力の組の一部と考えてはならない
って解釈でいいのかな?

648 :デフォルトの名無しさん:2015/02/22(日) 01:25:00.60 ID:EMxeLusr
>>645
>副作用の説明として、ある入力の組に対して複数の出力の組の場合があり、そういう現象を起こすのがIOや破壊的代入とある

この「ある入力の組に対して複数の出力の組の場合があり」という1対多の関係は、
確かに数学だと関数ではない
で、この板/スレでは(数学ではなく)プログラミング言語とその表現論を議論している訳だから、
ソフトウェア科学の中で対応する概念を考えてみると、たとえば非決定性があるね

非決定性には複数の意味があり、一つはパズルやゲームの分野で解の探索で用いられる
たとえばゲームで次の一手を計算する関数は、ゲーム盤のある局面(=入力)に対して
次の局面(=出力)が複数確定するから非決定的と呼ばれる
もう一つは評価してみなければ結果が確定しない関数のことで、代表的な例には
マッカーシーの amb やターナーの merge があり、それらは総称して非決定的関数と呼ばれる
(他には並行/並列計算の分野でも非決定性は用いられるけど、おそらく今回は無関係だろう)

さて副作用の中で、おそらく入力関数は後者の非決定性が該当すると思われる
けれども出力関数は常にある値からただ一つのユニット値が確定するから決定的に見えるし、
破壊的代入関数についてはどちらにも該当するように見え、同時に操作的意味論だと
破壊的代入という操作を代入前の値から代入後の値への関数として定義するから決定的にも見える

ということで、出力や破壊的代入はどちらに対応するのかを具体的に解説して欲しい
あるいは非決定性とは別の(ソフトウェア科学における)概念を用いた説明でもかまわない

649 :デフォルトの名無しさん:2015/02/22(日) 01:36:02.13 ID:EMxeLusr
>>647
その解釈だと否定形だけで終わっているから、
関数型言語で副作用は扱えないという結論になってしまうよね
でも現実には先行評価はもちろん遅延評価であってさえも副作用を扱う事ができるから、
どこかが間違っている or なにかが足りていないんじゃないかな?

650 :デフォルトの名無しさん:2015/02/22(日) 02:59:53.72 ID:CqpSwth4
実務とかいう不純不誠実極まるものが世の中から消え去れば、純粋関数で全てが記述できる

651 :デフォルトの名無しさん:2015/02/22(日) 10:47:16.95 ID:nNPYfFU0
おまえらはそもそも型を信じてない
だから、IO型が副作用でそれ以外は純粋、という定義を認めない
型チェックを信じられないならPythonとかを使えばいい
副作用の有無をチェックする必要もないだろ

652 :デフォルトの名無しさん:2015/02/22(日) 11:16:44.39 ID:zFsBha6g
>>644
特別なことはなにも言ってないw
純粋な関数とは数学的意味での関数ということ。
表現から値が一意に決まる。

>>645
わからないのか?

>>651
何を言ってるの?

653 :デフォルトの名無しさん:2015/02/22(日) 12:47:55.99 ID:nNPYfFU0
何を言ってるのかわからない情報弱者を助けるべきというのは正しい
もし弱者のふりをする強者がいたとしも考えを変えるべきではない
弱者のふりをする強者は、弱者を助ける政策を変えさせようとするテロリストだから

654 :デフォルトの名無しさん:2015/02/22(日) 13:29:41.18 ID:0njaRTk3
作用のない関数って何者なんだろう?
xを入力するとxがそのまま帰ってくる関数(?)しか思いつかない

655 :デフォルトの名無しさん:2015/02/22(日) 13:34:08.70 ID:jAanobMm
呼ぶことはできるけど何もしないし何も返さない、純粋階段みたいな代物なんだろう。

656 :デフォルトの名無しさん:2015/02/22(日) 13:37:05.55 ID:zFsBha6g
>>648
出力や破壊的代入は非決定性とは関係ないだろうね

657 :デフォルトの名無しさん:2015/02/22(日) 13:51:59.84 ID:zFsBha6g
>>654 >>655
作用なんて概念がどこで必要になるか考えてみ

658 :デフォルトの名無しさん:2015/02/22(日) 13:57:27.04 ID:0njaRTk3
>>657
数学的意味でっていうのも含めて関数の時点で作用があるとしか思えないので
ぜひ作用のない関数の例を教えてほしい

659 :デフォルトの名無しさん:2015/02/22(日) 14:01:23.55 ID:0njaRTk3
あ、ちなみに、入出力が写像である=入力を対応する出力に変換する=作用だと思っている
この言葉の定義が違うのかな?

660 :デフォルトの名無しさん:2015/02/22(日) 14:33:32.11 ID:nNPYfFU0
>>648
入力は IO a
出力は a -> IO ()
この IO () は型引数がいらないのでMonadである必要はなくてMonoidでもよかった

661 :デフォルトの名無しさん:2015/02/22(日) 16:22:04.52 ID:U2leqzH6
>>645はきちんとわかってるが>>652はなにもわかってない。

662 :デフォルトの名無しさん:2015/02/22(日) 16:22:49.66 ID:qqnO2/LE
なんか非常どうでもいい事で議論になってるんだけど
それ別のところでやってくんない?
haskellと関係ないし

663 :デフォルトの名無しさん:2015/02/22(日) 16:33:25.93 ID:PSZ9BlIS
cabal instll --dependencies-only
とやってもインストールされないパッケージがある。

作業の流れはこう。

$ cabal sandbox init
$ cabal init

*.cabal ファイルの build-depends を埋める。

$ cabal install --dependencies-only
$ cabal configure --enable-test

最後の段階でエラーメッセージが出力される。
cabal: At least the following dependencies are missing:
test-framework-hunit ==0.3.*

*.cabal ファイルにはちゃんと

Test-Suite Something
build-depends: ・・・ test-framework-hunit >= 0.3 && < 0.4 ・・・

と書かれてるんたが。
何でだろ?

664 :デフォルトの名無しさん:2015/02/22(日) 16:37:32.92 ID:PSZ9BlIS
>>663
書き忘れたが、*.cabal ファイルの build-depends に書いた他のパッケージ、
たとえば test-framework-quickcheck などはちゃんとインストールされた。

test-frmework-hunit だけがインストールされない。

665 :デフォルトの名無しさん:2015/02/22(日) 16:51:49.20 ID:PSZ9BlIS
>>664
自己解決した。
cabal install の方にも --enable-tests オプションがいるのか。

流れをぶった切ってすまんかった。
議論を続けてくれ。

666 :デフォルトの名無しさん:2015/02/22(日) 18:38:37.57 ID:zFsBha6g
>>659
純粋な関数にとって、ここの「変換する」、「作用」は余計な言葉だね

667 :デフォルトの名無しさん:2015/02/22(日) 23:06:21.86 ID:+tjqckF6
午前10時ごろ、福島第一原発で、原発の港湾につながる排水路に設置されている放射性物質を検知するモニターの警報が鳴りました。
数値は通常、1リットルあたり100ベクレル以下ですが、最高で7230ベクレルを記録。
このため、東京電力は、排水路のゲートを閉めたほか、汚染水の移送作業を停止しました。

汚染水のタンクの水位計に目立った変化などはないということですが、東京電力は、汚染水が港湾内に流出したとみて原因を調べています。

668 :デフォルトの名無しさん:2015/02/23(月) 03:00:06.38 ID:yHlUAJts
命令型言語の典型的な命令だって、表示意味論からすれば
可能な機械状態の集合Sの直積S×Sの部分集合にほかならない。
これはSからSへの純粋な関数そのものだ。

669 :デフォルトの名無しさん:2015/02/23(月) 07:55:17.60 ID:XYitOeCr
きれいはきたない、きたないはきれい

670 :デフォルトの名無しさん:2015/02/23(月) 20:41:44.57 ID:l7nfI0Hl
今ホットなライブラリは?

671 :デフォルトの名無しさん:2015/02/23(月) 23:05:43.29 ID:QYJUtpb4
関数プログラミング言語Haskellから668へひと言ある?

672 :デフォルトの名無しさん:2015/02/23(月) 23:33:39.87 ID:8CPFjaoD
>>670
世界で、あるいは日本で話題になっているものは残念ながら知らないが、
今自分の中でホットなのは Reflection。

Haskell でモックを作れないかと調べてたら、こんなのがあった。
http://blog.nonowarn.jp/post/184938189/mocking-in-haskell-with-reflection-type-class
古いネタだけどね。

673 :デフォルトの名無しさん:2015/02/23(月) 23:46:23.43 ID:8CPFjaoD
>>670
ちなみに、私はモックをきっかけに reflection を知ったが、
このライブラリ自体はかなり凄いことをやってのけてて、
応用(適用)範囲も広いと思う。

http://cx4a.org/posts/2014-06-03-solve-the-configurations-problem-for-haskell.html

674 :デフォルトの名無しさん:2015/02/24(火) 00:00:19.36 ID:2W8BrWDD
>>673
仕組みは分からんけどおもしろいアプローチだね

675 :デフォルトの名無しさん:2015/02/24(火) 00:09:48.65 ID:sS4fe1na
>>673
これHaskellの仕様外なのでGHCの実装が変わったら使えなくなるということはありませんか?

676 :デフォルトの名無しさん:2015/02/24(火) 03:27:43.34 ID:8m2gPI9o
>>671
わかってないのかもしらんが、>>668のような事情があるから
Haskellの内部で命令型言語を容易に再発明できるのだよ。

677 :デフォルトの名無しさん:2015/02/24(火) 08:03:23.82 ID:S2pCR91J
事情w
関数型言語は命令型言語、命令型言語は関数型言語

678 :デフォルトの名無しさん:2015/02/24(火) 08:28:54.89 ID:UvByGB8V
ハスケルなら脱アルゴリズムできる??

679 :デフォルトの名無しさん:2015/02/24(火) 08:59:18.55 ID:XZZcWcPm
Haskellの功績は、命令型には数学的根拠がないとかいう俗説を反証したこと

680 :デフォルトの名無しさん:2015/02/24(火) 17:54:38.62 ID:DnqBFQEe
>>=って引数の順序逆じゃね?
FunctorもApplicativeも関数→データ→返り値なのに何でMonadだけデータ→関数→返り値なの?

681 :デフォルトの名無しさん:2015/02/24(火) 18:08:03.66 ID:Qwy2iHqI
>>680
> >>=って引数の順序逆じゃね?

なんでだろうね

逆がいいなら =<< もあるが

682 :デフォルトの名無しさん:2015/02/24(火) 18:55:37.66 ID:8m2gPI9o
>>680
>何でMonadだけデータ→関数→返り値なの?

関数を後ろにしないとラムダ式のネストを連鎖させて書きにくいからだろう。

683 :デフォルトの名無しさん:2015/02/24(火) 20:29:32.00 ID:9OYj7FQ2
中置記法なんだから引数が逆だったら使ったときに見た目がキモイ

684 :デフォルトの名無しさん:2015/02/24(火) 21:18:59.73 ID:Egwh0d/F
>>675
使えなくなるかもね。
ただ、reflection パッケージはつい最近も更新されてはいる。

命令型言語のグローバル変数のようなことがしたいのなら、
ghc の言語拡張 ImplicitParams というのもある。

685 :デフォルトの名無しさん:2015/02/25(水) 11:25:52.12 ID:EI9coWAt
>>643
純粋な関数の作用は「値を返すこと」だよ。Haskellでは「普通の意味では値を返さない」関数も ()::()を返すことによって
形式上は値を返す。

686 :デフォルトの名無しさん:2015/02/25(水) 11:30:47.69 ID:EI9coWAt
>>681
ある値に次々と関数を適用する場面を考える。最初の値をxとしよう。

1.まず f を適用すると f x になる
2.つぎに、この結果に対して g を適用すると g ( f x) となる。
3.つぎに、この結果に対して h を適用すると h ( g ( f x ) ) となる。

こうしてみると、思考の流れである『 to x, apply f, then apply g, then apply h ...』 と左右が逆になってる。

>>= はKleisli射に対して x f g h の順番で書けるように工夫したものだと、言える。(ざっくりした説明)

687 :デフォルトの名無しさん:2015/02/25(水) 13:41:55.23 ID:20DVabgT
珠玉のアルゴリズムデザインの話が出ないな
このスレの住人とて捻り鉢巻な難易度なのだろう

688 :デフォルトの名無しさん:2015/02/25(水) 13:59:16.45 ID:zpTHLWvM
>>668
>>676
>>677
>>679
例えば、
x=1; y=2; x=x+y; print x; print y
という命令型プログラムを純粋関数で書くと
どうなるのでしょうか

689 :デフォルトの名無しさん:2015/02/25(水) 17:10:15.53 ID:4X+FbhYD
>>688

メモリの値とターミナルの状態という機械状態を
S=<("x",Vx),("y",Vy),(T)>と表すとして
だとして、

x=1;
→ 関数(f1) --- f1 <("x",Vx),("y",Vy),(T)> = <("x",1),("y",Vy),(T)>
y=2;
→ 関数(f2) --- f2 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",2),(T)>
x=x+y;
→ 関数f3 --- f3 <("x",Vx),("y",Vy),(T)> = <("x",Vx+Vy),("y",Vy),(T)>
print x;
→ 関数f4 --- f4 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vx)>
print y;
→関数f5 --- f5 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vy)>

で、これを(逐次実行は関数合成として理解できるので)関数合成すると
f5 . f4 . f3 . f2 . f1 <("x",Vx),("y",Vy),(T)> = <("x",3),("y",2),(T++ "3" ++ "2" )>
という関数になる。

690 :デフォルトの名無しさん:2015/02/25(水) 17:16:52.68 ID:GkGCDPjk
>>688
newIORef 1 >>= \ x ->
newIORef 2 >>= \ y ->
(fmap (+) (readIORef x) <*> readIORef y) >>= writeIORef x >>= \ () ->
readIORef x >>= print >>= \ () ->
readIORef y >>= print

691 :デフォルトの名無しさん:2015/02/25(水) 17:17:12.91 ID:4X+FbhYD
あ、書き落としてたが、これらの関数・写像は
S → S なので、そのグラフはS×Sで、
つまり命令形の手続きはSの直積の部分集合と同一視できるということになる(というか数学的には同一)。

692 :デフォルトの名無しさん:2015/02/25(水) 17:18:00.41 ID:4X+FbhYD
>>690
あ、そういう答えを要求してるんだったのか……

693 :デフォルトの名無しさん:2015/02/25(水) 20:03:19.53 ID:zpTHLWvM
期待していたのは、>>689のほうの答えでした。いま熟読中です。
今の時点で気になっているのは、ここにある各演算毎の関数的定義は、
演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
変わってしまうということはないのでしょうか?
例えば、状態空間の中にzが加わると、同じ演算の関数定義が変わってしまう
ということはないのでしょうか?
もしそうだとすると、命令型の手続きを純粋関数で書けるというのはやや
誤解を生じるのではないかと思うのですが。

694 :デフォルトの名無しさん:2015/02/25(水) 20:13:44.32 ID:YonVottM
>>684
ありがとうございます
互換性に不安を抱えたまま開発を続けるのはつらいのでReflectionを使わない方法を模索することにします

695 :デフォルトの名無しさん:2015/02/25(水) 21:40:11.60 ID:4X+FbhYD
>>693
>演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
>変わってしまうということはないのでしょうか?

というか、逐次実行が関数合成になるように状態空間を定めるので、話は逆。
手続が内部で持ってる状態を全部引数に蓄積子として突っ込んでいけば
最終的に必ず純粋な関数になるので大丈夫、というだけの話ではあり。

696 :デフォルトの名無しさん:2015/02/25(水) 21:48:26.31 ID:Slhdy+4b
>>693「もしそうだとすると」で前後が繋がってない。
各行は定義ではなく、具体的な状態Sが関数適用でどう変化しているかを述べていて、
>>688は説明を簡単にするためにxとyとターミナルの状態のみを扱っている

例えばx=1という式はx以外の変数やターミナルの状態を変えないから、
f1 <("x", _), vars, T > = <("x", 1), vars, T>
みたいに書ける。これならzをどこに入れようが定義は変わらない。

697 :デフォルトの名無しさん:2015/02/25(水) 22:52:25.07 ID:zpTHLWvM
ということは、やはり>>677などがいうように、関数型と命令型を理論的に区別することは
できないということなのでしょうか

698 :デフォルトの名無しさん:2015/02/26(木) 01:10:29.61 ID:XuDII8Li
関数型内部に命令型言語を作るのは難しくないが、逆は難しい。
しかし、それは人間的困難に過ぎないので、そこを捨象すれば
チューリングマシンとラムダ算法が等価であるというのとまったく同じ意味において、
両者は等価であり、区別することはできない。

699 :デフォルトの名無しさん:2015/02/26(木) 02:12:16.21 ID:D8nkDIff
グローバル変数があるようなプログラムだって、その全てを変数として引き回すように変形すれば純粋関数的になっちゃう。
モナドは暗黙の状態引き渡しをやる仕組みと言えなくもないし、部分的には命令型的パラダイムを導入してるという考え方はできる。

700 :デフォルトの名無しさん:2015/02/26(木) 08:46:56.43 ID:y/w7Kxu/
正直、現代情報技術はそろそろアルゴリズムから脱却しても良いのでは?

701 :デフォルトの名無しさん:2015/02/26(木) 10:19:14.44 ID:WaBGyhy5
>>700
お前、毛の壁ナイズされ過ぎ。

702 :デフォルトの名無しさん:2015/02/26(木) 10:34:39.06 ID:BNBT94Ul
知ってて使うのと知らんで使うのじゃ雲泥

703 :デフォルトの名無しさん:2015/02/26(木) 11:05:53.08 ID:QQhjsWl0
だからモナドじゃなくIO型って言えよ。初学者には害悪にしかならん。

704 :デフォルトの名無しさん:2015/02/26(木) 11:15:19.32 ID:btOYc4SG
[´・_ ← 尊敬するHaskellerの再就職決まったみたいでなにより

705 :デフォルトの名無しさん:2015/02/26(木) 11:31:19.10 ID:dD65fmOl
1週間で初心者から脱却するみたいな考えが悪い
スポーツとかなら10年かかっても不思議ではないのに

706 :デフォルトの名無しさん:2015/02/26(木) 11:59:30.21 ID:QQhjsWl0
だから何で馬鹿な方向に誘導してんだ馬鹿。モナドだから何がいいのか分かっているのか馬鹿。
「XはYである」と言うならYと見なした理由もちゃんと書け馬鹿。XをYと見なした時にどんだけ便利なのか書け馬鹿。
おめーは自然数を教えるのにチャーチ数を教えるのか馬鹿。
おめーは「脳はコンピュータと言える」とか言って脳の研究でコンピュータを調べるのか馬鹿。
そんな絶望的な馬鹿なら10年かかっても不思議じゃねーよ。

707 :デフォルトの名無しさん:2015/02/26(木) 12:00:51.61 ID:btOYc4SG
>>705
早期教育が必要

708 :デフォルトの名無しさん:2015/02/26(木) 14:42:26.59 ID:dD65fmOl
現代情報技術は嘘つきとか馬鹿とかがうようよしてるという前提で時間を見積もらないと

709 :デフォルトの名無しさん:2015/02/26(木) 21:35:55.82 ID:+ZHOz+Fz
>>700

その通りだと思う。
しかしその具体的な動きはすでにあるのかな?

>>701

いや、Okabe氏は素晴らしいと思うよ。
彼にはもっともっと発信してほしい。

710 :デフォルトの名無しさん:2015/02/26(木) 22:40:22.30 ID:u37SJBGi
haskell大好きおじさんて馬鹿ばっか
他の言語書いたことないやつとかhaskell語るなよ

711 :デフォルトの名無しさん:2015/02/27(金) 13:21:41.48 ID:luo4R3jS
>>709
俺も俺も。ああいうキチガイ芸人にはもっと発信して欲しかった。Qiitaの運営も見る目がない。

712 :デフォルトの名無しさん:2015/02/27(金) 18:39:34.08 ID:/mo2HZHK
プログラミング芸人か新ジャンル

713 :デフォルトの名無しさん:2015/02/27(金) 20:57:22.30 ID:QBCyKoap
>>710
haskellやってる人で他の言語やった事ない人ってすごい少数派だと思うぞ

714 :デフォルトの名無しさん:2015/02/27(金) 21:55:00.85 ID:6wGrZzep
FFIがある以上、Haskellが最初の言語でも最終的にはC/C++は必要になる

715 :デフォルトの名無しさん:2015/02/28(土) 07:19:37.54 ID:dnl6aVQ8
SQLやcabalの質問に対するレスの少なさや、スノッブが好きそうな話題には食いつくあたりを見ると、
他言語はおろかhaskellを使っているかも怪しい。

716 :デフォルトの名無しさん:2015/02/28(土) 11:31:00.53 ID:/a49nmDi
静的型付けのレスが少ないということは
本当はPython使ってるだろ

717 :デフォルトの名無しさん:2015/02/28(土) 12:00:03.72 ID:lNsAK58t
Python 使ってて動的型楽だな&amp;#12316;&amp;#12316;静的だるいと思ってましたが Haskell に出会って改心しました

718 :デフォルトの名無しさん:2015/02/28(土) 12:18:51.86 ID:d9oEn1cs
Haskellでアプリ書いてる人なんていないでしょ

719 :デフォルトの名無しさん:2015/02/28(土) 12:53:22.56 ID:/a49nmDi
でもネイティブアプリを作れないやつよりはまともだよ

720 :デフォルトの名無しさん:2015/02/28(土) 14:57:14.27 ID:WBmhRPKM
むしろ書き捨てるスクリプトの類をHaskellで書くことが殆どになった。
Parsecが激しく便利なのでやめられないし、グルー言語としても優秀。
後はふと思いついたことをプロトタイピングして試すのにとても便利。
モナドの中を除いてコードをどこにどういう順番で書いても大丈夫なのが地味に利く。

721 :デフォルトの名無しさん:2015/02/28(土) 17:21:51.10 ID:+vurDehh
>>720
>後はふと思いついたことをプロトタイピングして試すのにとても便利。

ここは禿しく同意

722 :デフォルトの名無しさん:2015/02/28(土) 17:34:44.86 ID:ww/ZmHX+
haskellって今盛り上がってるの?

723 :デフォルトの名無しさん:2015/02/28(土) 17:35:54.16 ID:ww/ZmHX+
>>716
あのスレID付く前は勢いすごかったのにな

724 :デフォルトの名無しさん:2015/02/28(土) 17:37:41.63 ID:0XiMknGf
>>722
n年前から「今年盛り上がる」って言われ続けてる

725 :デフォルトの名無しさん:2015/02/28(土) 20:20:30.25 ID:4FBvatWb
盛り上がるっていうのが業務系システムやwebサービスの開発に使われるって意味なら、そんな日はまず来ないと思うよ

726 :デフォルトの名無しさん:2015/02/28(土) 20:27:53.14 ID:Ywc+frof
とあるヘッジファンドのシステムがOCamlで作られているそうな

727 :デフォルトの名無しさん:2015/02/28(土) 20:51:48.98 ID:0l2BG5kB
東京電力福島第一原子力発電所の事故では、緊急時の作業員の被ばく線量の上限の値が
急きょ引き上げられるなど、対応の不備が指摘されました。
この問題を話し合うシンポジウムが28日東京で開かれ、上限の引き上げや事前の同意の
必要性について意見が交わされました。

4年前の原発事故では、当初100ミリシーベルトとしていた緊急時の被ばく限度が収束作業に
支障が出るとして、事故の3日後、急きょ250ミリシーベルトに引き上げられました。
事故の6日後、政府はさらに国際機関が推奨している500ミリシーベルトへの引き上げを検討しましたが、
事故対応に当たった防衛省や警察庁からも反対の声が上がり、見送られました。
シンポジウムは放射線防護の専門家で作る日本保健物理学会が開き、東京電力の担当者は、
174人が100ミリシーベルトを超え、250ミリシーベルトを超えた作業員も6人いたことを報告し、
「引き上げがなければ作業はより難しかった」と話しました。
パネリストからは、「国際的な基準に合わせるべきだ」といった意見の一方、
「250ミリシーベルトも500ミリシーベルトも医学的な根拠となるデータが少なく、納得が得られるか疑問だ」
といった意見も出されました。
また、数字の議論だけでなく、事前に同意を得ることや、長期的な健康調査も重要な検討事項
だという指摘が出されていました。

作業員の被ばく限度について原子力規制委員会は、250ミリシーベルトへの引き上げを軸に、
事前の意思確認や教育などを事業者に求めていく方向で検討することにしています。

一方で、上限の引き上げについては労働者団体などが反対しているほか、
厚生労働省が慎重な姿勢を見せています。
原発事故以降、廃炉現場での被ばく対策を求めるなど、作業員の支援をしている東京労働安全衛生センターの
飯田勝泰事務局長は、「被ばくを余儀なくされる人たちが生涯背負う健康リスクに誰が責任を負うのか、
その後に生じるさまざまな問題に対してどれだけサポートや補償などがあるかを含めて、
当事者を交えて議論すべきだ」と訴えています。

728 :デフォルトの名無しさん:2015/02/28(土) 22:05:28.81 ID:BICS2QXM
>>726
おいHaskellerを刺激するなよ

729 :デフォルトの名無しさん:2015/02/28(土) 23:57:43.09 ID:Nt6Wj8CT
ヘッジファンドとか、虚業の世界で使われていると聞いても嬉しくない。

730 :デフォルトの名無しさん:2015/03/01(日) 00:00:10.61 ID:fa5PZpFW
しかし、現在の東大のトップクラスの人材はゴールドマン・サックスみたいな外資系投資銀行か
ヘッジファンドに就職するもんだよ。

731 :KenOkabe:2015/03/01(日) 00:24:52.20 ID:pyXXwOct
知ったかぶりしかできない生半可通の巣窟スレ

732 :デフォルトの名無しさん:2015/03/01(日) 12:33:53.88 ID:V/GWmw6D
例えばこのような型クラスとそのインスタンス型があるとします。

class ABC t where
 abc :: t -> IO Int

data X = 何か
instnce ABC X where
 abc x = 何か

アプリケーションの本番環境ではこれでいいのですが、
この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。

abc関数をX型の値に適用したとき、戻り値を以前戻した値に基づいて計算したいとか、
適用する度に予め用意したリストから順に値を戻したいという場合があります。

例えば初めての適用なら5::IO Intを、2回目の適用なら13::IO Intを戻したいとか。
前回10::IO Intを戻したなら、今回はerror関数を使って例外を投げるとか。
状態を保存しないとできないことです。

このようなことが本番環境でも必要なら、ABC型クラスの定義を例えば下記のように変え、

class ABC t where
 abc :: t -> IO (Int, t)

X型の値の中に状態を保存するようにします(要はMap型などと同じやり方です)。

しかし、今回はデバッグやテストのためだけです。
そのためだけに全体のアーキテクチャを変えてしまうのは如何なものかとも思うのですが、
デバッグやテスト優先で変えるべきでしょうか。
それとも、関数を使用する側は変えなくても良い、
あるいは変えるとしても些細な修正ですむ方法があるでしょうか。

733 :デフォルトの名無しさん:2015/03/01(日) 12:46:43.60 ID:FWNFrpmY
type synonym とか?

734 :デフォルトの名無しさん:2015/03/01(日) 13:21:28.34 ID:OeCCJL5w
>>732
unsafePerformIO使う(というかまさに使いドコロ)。

735 :デフォルトの名無しさん:2015/03/01(日) 14:22:17.54 ID:y+77PkOT
global_abc = unsafePerformIO (newIORef [5, 13])
abc x = do{(y:ys)<-readIORef global_abc; writeIORef global_abc ys; return y}

736 :デフォルトの名無しさん:2015/03/01(日) 15:10:50.59 ID:V/GWmw6D
>>734 >>735
デバッグやテストが目的なら躊躇せずSystem.IO.Unsfe系を使いましょうと言うことですか。

本番環境ではさすがに使いたくないですが、本番環境を汚さずにデバッグやテストするのが目的なら、
悩んで複雑な仕組みを構築するより、気をつけてUnsafe系を使う方法を考えた方が建設的てすね。

アドバイスありがとうございます。


>>733
どういうことでしょうか。

737 :デフォルトの名無しさん:2015/03/01(日) 15:42:52.81 ID:YT+HWRLq
abc : t -> IO Intからabct : t -> IO (Int, t)を作ればいいんじゃないかと思うんだけど駄目なのか
abct t = do

738 :デフォルトの名無しさん:2015/03/01(日) 15:45:51.87 ID:YT+HWRLq
途中で送っちゃった
abct t = do
r <- abc t
return (r, t)

739 :デフォルトの名無しさん:2015/03/01(日) 17:59:38.32 ID:V/GWmw6D
>>738

>>732でも言いましたが、本番環境でも状態を保存する必要があるのなら
私も迷わずその方法を採用したいと思います。

しかし、今回はデバッグやテストのためたけの仕組みです。
abc関数を使用する(呼ぶ)側にはあまり手を着けたくないというのが正直なところです。
多少修正する程度でしたらまだいいのですが、戻り値で状態を返し、
関数の呼び出し側でそれを保持するとなると、アプリケーションの作り方にまで影響が及びます。

できればそれはちょっと避けたいな、と。

740 :デフォルトの名無しさん:2015/03/01(日) 18:02:35.56 ID:DwkMIW7d
モナドの出番では
Writerモナドとか

741 :デフォルトの名無しさん:2015/03/01(日) 19:28:30.37 ID:YT+HWRLq
>>739
デバッグ用テスト用のファイル/モジュールでt -> IO (Int, t)を返す関数を定義すれば本番用のコードを汚さないよ?

742 :デフォルトの名無しさん:2015/03/01(日) 19:54:14.26 ID:2wRYmT3l
MonadIOにしとけば困らなかったのに

743 :デフォルトの名無しさん:2015/03/01(日) 22:48:32.59 ID:V/GWmw6D
>>741
後出しじゃんけんのようで本当にすいません。
結局やりたいのはこういうことです。

本番環境
ModuleA
  ABCクラスのインスタンス型の値を使う
ModuleB
  ABCクラスの定義(abc :: t -> IO Int)
ModuleC
  ABCクラスのインスタンス型Xの定義
ModuleD
  ABCクラスのインスタンス型Yの定義

テストやデバッグ用
ModuleX
  ModuleAの関数のテストやデバッグのために
  ABCクラスのインスタンス型Zの定義
  要するにスタブとかダミーみたいなもの
  ただし、状態を保ちたい

ABCクラスのインスタンス型の値の状態を保つことは、
本番環境では不要なことなんです。
状態を保たなくてもアプリケーションの処理は問題なく回ります。
本番環境に無くても良い余計な処理は入れたくないです。

ModuleAから呼ぶ関数はModuleBで定義したABCクラスのabc関数であって、
>>738のabct関数をModuleXで定義しても、ModuleAからは呼ばれません。

トンチンカンなことを言っていたらごめんなさい。

744 :デフォルトの名無しさん:2015/03/01(日) 23:04:42.28 ID:V/GWmw6D
>>740
Writer Int型を使うということでしょうか。
今回の目的を達成するためにはどのように使えばよいか考えてみましたが、
すいません、よく分かりませんでした。
どのように使えばよいのでしょうか。

>>742
こちらも、どのように使えば目的が達成できるか、分かりませんでした。


お二人とも、簡単な例を示していただけると助かります。

745 :デフォルトの名無しさん:2015/03/02(月) 00:13:52.37 ID:6Ba1RdPX
>>732
すいません、これがマズい言い方でした。

> アプリケーションの本番環境ではこれでいいのですが、
> この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。

これでは、型Xを使う側は本番環境ではないように聞こえますね。

ここで言いたかったことは>>743の前半の状況です。
紛らわしくてごめんなさい。

746 :デフォルトの名無しさん:2015/03/02(月) 01:22:46.34 ID:Sw+/g9Qu
>本番環境に無くても良い余計な処理は入れたくないです。

例えばnewが不要な所ではstatic変数を使いたいとか
たまにそういう人いるよね

747 :デフォルトの名無しさん:2015/03/02(月) 06:52:05.12 ID:6Ba1RdPX
>>746
良くないことでしょうか。

748 :デフォルトの名無しさん:2015/03/02(月) 07:15:11.30 ID:IugrOvyf
二分木定義から二分探索木作りたのですが教えていただけませんか
data BinTree = Empty | Node{val :: a, left :: BinTree a, right :: BinTree a} deriving Show
newtype BinSrchTree a = BinTree a deriving (Show, Eq, Ord)
main = print (Empty :: BinSrchTree Int) --BinSrchTree IntがBinTree a0に一致しない言われる

749 :デフォルトの名無しさん:2015/03/02(月) 09:57:42.00 ID:oxqFLeZk
data BinTree a = Empty | Node{val :: a, left :: BinTree a, right :: BinTree a} deriving Show
newtype BinSrchTree a = BS (BinTree a) deriving Show
main = print (BS Empty :: BinSrchTree Int)

ghci> main
BS Empty

750 :デフォルトの名無しさん:2015/03/02(月) 10:08:38.53 ID:IugrOvyf
なるほどコンストラクタ見落としていました
ありがとうございます

751 :デフォルトの名無しさん:2015/03/02(月) 11:04:53.22 ID:Sw+/g9Qu
>>747
static変数というかグローバル変数は
引数や戻り値の型を無視してデータの受け渡しをするので型システムにとっては悪い

752 :デフォルトの名無しさん:2015/03/02(月) 12:36:54.96 ID:6Ba1RdPX
>>751
そういう意味でしたか。
staticを静的の意味と勘違いしていました。

それで、意味は分かりましたが、今回の私の件に
どのように繋がってくるでしょうか。
私への教訓でしたら大事なことなのでしっかり聞いておきたいです。

753 :デフォルトの名無しさん:2015/03/02(月) 13:17:22.99 ID:Sw+/g9Qu
>>752
型システムの目的は本番環境の処理を速くすることではないので
目的が違う人と対立する場合もあります

754 :デフォルトの名無しさん:2015/03/02(月) 14:13:28.84 ID:YiBmijbS
>本番環境に無くても良い余計な処理は入れない
これ何か問題があるの?

その後の指摘?とのつながりが分からん

755 :デフォルトの名無しさん:2015/03/03(火) 11:43:12.43 ID:SAUuRVc4
技評で山本和彦さんの新連載が始まってるよ。

[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!
http://gihyo.jp/dev/feature/01/functional-prog

756 :デフォルトの名無しさん:2015/03/03(火) 13:50:00.68 ID:RopS8Jun
関数型じゃなくてHaskellって書けばいいのに

757 :デフォルトの名無しさん:2015/03/03(火) 16:24:30.16 ID:uc5uKGLf
>>756
それは思った

758 :デフォルトの名無しさん:2015/03/03(火) 18:44:42.74 ID:0qnRlFIR
Haskell特有の話なんかなにもしてないんだから
関数型という表記でなんの問題もないのだが。

それより、一部で根強い「関数プログラミング」という表記のほうがイヤ。

759 :デフォルトの名無しさん:2015/03/03(火) 18:59:03.33 ID:WJJOCC/K
>>758
Bird & Wadler を訳した武井さんに敬意を表してるんだろうな

760 :デフォルトの名無しさん:2015/03/03(火) 19:01:24.47 ID:0NfvnnKp
武市

761 :デフォルトの名無しさん:2015/03/03(火) 20:17:41.38 ID:RopS8Jun
関数型の定義が人それぞれって書いてあるしそれは正しいと思うけど
その理屈に則るなら誤解をされないように(筆者の)関数型じゃなくてHaskellって表記すればいいのにってだけ

762 :デフォルトの名無しさん:2015/03/03(火) 20:25:58.13 ID:0qnRlFIR
>>761
あの内容なら別にOCaml使っても同じだろ。
そもそもHaskellの布教したいわけじゃなくて、
kazの定義するところの「関数型」の布教がしたいんだろうからな。

763 :デフォルトの名無しさん:2015/03/03(火) 22:34:31.14 ID:9fOX7cOm
データ型のレコードを更新するのって面倒いよね。

data Foo = Foo {bar :: Int}
let foo = Foo 1
let baz =foo {bar = 10 + bar foo}

この bar = 10 + bar foo を bar = 10 + bar でできるようにする言語拡張ってないの?

764 :デフォルトの名無しさん:2015/03/04(水) 01:10:55.55 ID:OQ0tAhEv
barはデータからフィールドを取得する関数なのでパラメータにデータを渡さなければ対象を特定できない

765 :デフォルトの名無しさん:2015/03/04(水) 01:33:39.74 ID:EScOogLy
モナドの中でもなんでもないところでそういう書き方をできる方がむしろ気色悪い。

766 :デフォルトの名無しさん:2015/03/04(水) 01:42:46.42 ID:3Rn4etK5
>>763
使える状況が限定されるけどRcordWildCards
あとは演算子がキモいlens

767 :デフォルトの名無しさん:2015/03/04(水) 02:05:22.33 ID:OQ0tAhEv
言語のコンセプトというか性質を踏まえずに構文だけ見てオブジェクト指向で解釈してしまった感がアリアリですね

768 :デフォルトの名無しさん:2015/03/04(水) 02:34:52.77 ID:EScOogLy
Haskellのレコードはfstやsndの代わりに好きな名前でアクセスできる
タプルという以上のものではない、というつもりで作られてることが
わかってれば、トップレベルの名前空間にぶちまけられてることも
そういう更新の仕方ができないことも不思議でもなんでもないんだけどね。

769 :デフォルトの名無しさん:2015/03/04(水) 17:54:26.26 ID:77Av1QBL
おまえらナンチャッテ専門家ってほんと、陰湿だな?

770 :デフォルトの名無しさん:2015/03/04(水) 17:55:24.64 ID:77Av1QBL
ガリレオだって最初は異端児扱いだった。岡部氏が評価されるのは死後だろう

771 :デフォルトの名無しさん:2015/03/04(水) 18:52:46.28 ID:4mY/lS/X
Haskellってもしかして引数に応じてStringもしくはIntを返す関数って作れない?

772 :デフォルトの名無しさん:2015/03/04(水) 19:22:58.77 ID:Z9o39cjF
そんな関数作れてたまるか

データ型あたらしく定義すれば

773 :デフォルトの名無しさん:2015/03/04(水) 19:24:29.53 ID:EScOogLy
>>771

趣旨がわからんが

data StrIntgr = Str String | Intgr Int deriving Show
f n = if n < 0 then Str "I don't like negative numbers." else Intgr n

みたいな直和型ではなんかいかんの?
ここで聞く前になにか自分で入門書読んだ方がよさそうな気がするが。

774 :デフォルトの名無しさん:2015/03/04(水) 19:41:36.42 ID:4mY/lS/X
>>773
言葉足らずですまん

もちろん自前で型をつければできるのは分かってるんだけど
型つけるといちいち型から取り出す関数を定義するとかFunctorクラスを実装するとかが必要になってきて
2つの異なる型を返す可能性があるだけで割と手間がかかるようになるけどHaskellだとそれが当たり前なのかなって

775 :デフォルトの名無しさん:2015/03/04(水) 19:43:00.66 ID:ZS6cL3ZV
Eitherって型があって必要なものは実装されてるから、ユーザーはただ使うだけでいいよ

776 :デフォルトの名無しさん:2015/03/04(水) 19:45:42.96 ID:EScOogLy
>>774
>2つの異なる型を返す可能性があるだけで割と手間がかかるようになるけどHaskellだとそれが当たり前なのかなって


そりゃ当たり前。そうじゃなきゃ型システムが台無しだろうが。
EitherつかってもRight/Leftのパターンマッチで取り出すのはおんなじ。

777 :デフォルトの名無しさん:2015/03/04(水) 20:05:47.70 ID:3Rn4etK5
LLで書いても結局どっちなのか判定すると思うんですが

778 :デフォルトの名無しさん:2015/03/04(水) 21:43:20.18 ID:P3s4t/V2
isInstanceOfとかif文の羅列とかswitchとか、実行時に判別しなきゃならんからな。
OCamlならopen variantで新たなデータ型を宣言しなくてもいいが。

779 :デフォルトの名無しさん:2015/03/04(水) 21:51:55.05 ID:zsHu2OsZ
型システムによってはできるよね
Haskellはできないけど

780 :デフォルトの名無しさん:2015/03/04(水) 23:24:56.05 ID:Ts02LONa
>>764-768
わかった。
ありがと。

781 :デフォルトの名無しさん:2015/03/05(木) 14:45:16.80 ID:HeDoVjrI
[(cond1, todo1), (cond2, todo2)...] :: [(IO Bool, IO ())]というリストがあります
先頭からcondをチェックして、Trueの場合はtodoを実行し、以降のチェックはしたくない時は
どのように書くのがスマートですか?
手続き型だとループを回してbreak/returnで抜けるパターンです
よろしくお願いします。

782 :デフォルトの名無しさん:2015/03/05(木) 16:02:01.66 ID:HeDoVjrI
とりあえずfoldM_でフラグとして初期値を与えて、todoを実行すればフラグを下ろす方法で望みの動作にはなりました

783 :デフォルトの名無しさん:2015/03/05(木) 16:40:37.70 ID:A3rdoDeo
そうか。

784 :デフォルトの名無しさん:2015/03/05(木) 17:34:45.93 ID:URkoYrlq
自分ならfindでcond部がtrueになるペアを探して見つかった奴のtodo部を実行する
という感じに書くけど、再帰でもなんでも好きに書けばいいんじゃないか

785 :デフォルトの名無しさん:2015/03/05(木) 21:42:01.23 ID:ZtE0KjEL
Linux 上で Windows 用の実行ファイルをビルドしたり、
Windows 上で Mac 用の実行ファイルをビルドする、
そんなことができる Haskell コンパイラはありますか?

あるいは GHC を使ってこのようなことはできるてしょうか?

786 :デフォルトの名無しさん:2015/03/05(木) 21:49:04.32 ID:Dzjm5JL8
>>785
なんでGHC + cross compilationでググらないのか聞いてもいい??

787 :デフォルトの名無しさん:2015/03/05(木) 22:33:40.71 ID:1dxQhv2o
ググっても分かんなかったんだろ

788 :デフォルトの名無しさん:2015/03/06(金) 07:06:47.09 ID:gxbo3gJi
クロスコンパイレーションと言うのですね。
この呼び方は昔聞いたことがあるような気がします。
調べてみます。
ありがとうございます。

789 :デフォルトの名無しさん:2015/03/06(金) 07:08:33.62 ID:Fpf9iYrB
ホストで動作するネイティヴなGHCと
クロスコンパイリングなGCCを用意する。
target=xxxxフラグでターゲットシステムを指定して
クロスコンパイリングなGHCをビルド。

ググればすぐわかるだろ。

790 :デフォルトの名無しさん:2015/03/06(金) 13:02:11.81 ID:YJArWnBq
性格悪いなー

791 :デフォルトの名無しさん:2015/03/06(金) 13:17:10.70 ID:euElO0P4
>>774
直和型が面倒なら高階関数にすれば楽だよ

792 :デフォルトの名無しさん:2015/03/07(土) 16:02:20.48 ID:lLxUVvgb
data Foo = Bar X | Baz Y と Either X Y ってどう使い分けるの

793 :デフォルトの名無しさん:2015/03/07(土) 16:36:05.33 ID:UBHk2s1Q
気持の問題。

794 :デフォルトの名無しさん:2015/03/07(土) 16:59:47.20 ID:LcaLHDJh
>>792
Eitherはエラー処理に使う、という慣習があるんで、それに従う。
問題ないならRight xで当該の値を返してエラーならLeft yでエラー内容を返す。

そもそも普通に直和型が必要な場合ならEitherにしないほうがあとで拡張しやすい。
直和型で2つだけで済むことってあまりないだろ。

795 :デフォルトの名無しさん:2015/03/08(日) 01:02:34.04 ID:3ltsFKaw

TubeFromPC-HD

YouTubeをPCで視聴しているとき、その動画を別のモニターへ退避させて、フルスクリーンでウェブブラウジング・メールなど別の作業をしたいと思ったことはありませんか?
二枚目のサブモニターがなくても大丈夫です。iPhoneとiPadをそれに利用しましょう。 
TubeFromPCは、PCで視聴していたYouTube動画をiOSデバイスで再生するためのユーティリティです。iPadではHD高画質を選択することも可能です。
ほんの数秒で、PC画面からiOS画面へと、Wifiネットワーク越しにYouTube動画を「移動」させてしまいます。
PCで何かソフトウェアをインストールする必要はありません。エスクテンション(アドオン)をブラウザ(Chrome,Firefox,Safari)にインストールして利用します。
そのため、Windows、MacOSX、Linux、Unixどのプラットフォームでも共通して動作します。

【つかいかた】
このアプリにより、iPhone/iPadとPCは、LAN(ローカルエリアネットワーク)経由で通信します。
iPhone,iPadがWi-Fi/無線LANに接続していることが必要です。PCもその同じLANに接続していることが必要です。
アプリを開いたら、青で表示されている [192.168.xx.xx:8080]という数字(ローカルアドレス)をブラウザのURL欄に入力してください。すると、ブラウザにTubeFromPCのWebアプリが表示されます。

最初にお使いのブラウザのセットアップ(エクステンションインストール)が必要です!
そのページの一番上にある「使い方 はじめての方へ」というリンクを開いてください。

Twitter: @kenokabe


ttp://www.advansteps.com/ipadsearch/cgi/search/search.cgi?mode=search&amp;word=firefox%20

796 :デフォルトの名無しさん:2015/03/08(日) 18:41:10.85 ID:DVgHzhfa
>>724
ボージョレヌーボーかよ

797 :デフォルトの名無しさん:2015/03/08(日) 22:35:24.46 ID:Z29u4kmy
>>793
>>794

ありがとうございます。もやっとしていた箇所が論理というより
慣習、使いやすさの問題であることが理解出来ました。

798 :デフォルトの名無しさん:2015/03/09(月) 05:48:29.40 ID:s9RXGrXO
日本でプログラマが少ない理由は正当な対価を支払わないからである
http://anago.2ch.net/test/read.cgi/bizplus/1425792285/
「日本史なんかより、プログラミングを教えるべき」

三木谷浩史氏と夏野剛氏が日本の技術者不足を嘆く

799 :デフォルトの名無しさん:2015/03/09(月) 18:32:41.03 ID:Ex/E2HEO
教えなくていいから好待遇にして無能が入ってこれないようにすればいいよ
そのためには医者みたいな免許制がいいな
国が発注するような重要な区分の案件には免許を持ったスタッフしか関われないんだよ

800 :デフォルトの名無しさん:2015/03/09(月) 20:40:58.82 ID:8xa3vBtz
data X = 何か deriving (Eq, Ord)
と型Xが定義されたモジュールをモジュールMにインポートしました。

モジュールMで型XをShowのインスタンスにしたいのですが、
deriving Show と定義したのと同じように定義したいです。

このような場合は、deriving Show と定義された場合の show 関数を
真似るように自作するしかないでしょうか。

それとも、後から別に deriving Show 宣言を型Xの定義に追加する方法があるのでしょうか。


ちなみに、Show なのはただの例です。
deriving で宣言可能な型クラス全てについての質問です。

801 :デフォルトの名無しさん:2015/03/09(月) 21:11:00.35 ID:icxJlozu
毎時200mSvのがれきを手で持って除去した原発作業員 胃と腸と膀胱でガンが見つかるも「因果関係なし」

802 :デフォルトの名無しさん:2015/03/09(月) 23:40:14.25 ID:niBaK9hS
>>800
StandaloneDeriving拡張を使え

803 :デフォルトの名無しさん:2015/03/10(火) 19:04:02.78 ID:eDEZXqUu
>>802
できました。
ありがとうございました。

804 :デフォルトの名無しさん:2015/03/10(火) 20:05:05.97 ID:g/a/DXRg
拡張ばっかりしてるとガバガバになりませんか?
キツキツが気持ちいいのではないでしょうか?

805 :デフォルトの名無しさん:2015/03/10(火) 20:10:52.92 ID:fs8coFhs
全ての型をShowクラスのインスタンスに無理矢理するような方法ってある?
ラムダ式とか複雑な型とかの整合性をコード片を評価して確認したいだけなのに毎回GHCiにShowクラスのインスタンスじゃないってエラー吐かれるのは精神衛生上良くない

806 :デフォルトの名無しさん:2015/03/10(火) 20:32:52.76 ID:w7quuwwx
拡張使ってると、ある日突然梯子を外されてソースが粗大ゴミと化す

807 :デフォルトの名無しさん:2015/03/10(火) 21:53:45.67 ID:6y+EDL2h
それは全てのライブラリについても同じことが言える。

808 :デフォルトの名無しさん:2015/03/10(火) 21:59:42.54 ID:cWhtU8Iv
>>805
http://ja.stackoverflow.com/questions/2572/

809 :デフォルトの名無しさん:2015/03/11(水) 07:49:05.85 ID:gQycLvpo
>>673

こういうのが一番梯子外されそう

810 :デフォルトの名無しさん:2015/03/11(水) 20:47:37.90 ID:TIci70wO
テストに関する質問です。

data TX = DX TY
data TY = 何か

このような型定義が同じモジュールでなされています。
型コンストラクタTXや、関数f::Int -> TXなどはエクスポートされていますが、
型コンストラクタTYはエクスポートされていません。

ここで、ある範囲内の値に関数fを適用したときに
同一のTX型の値が返ってくることをテストしたいです。

ただし、実際にアプリケーションが稼動しているときには必要ないので、
TX型もTY型もEq型クラスのインスタンスにはしていません。

よって、このままでは、テストのためにこのモジュールをインポートしているファイル内で
deriving instance Eq TX としてもエラーが出ます(型コンストラクタTYが公開されていないので)。


私は下記のどちらかを諦める必要があるのでは、と思いました。
  1. 型コンストラクタTYをエクスポートしないこと
  2. TX型やTY型をEq型クラスのインスタンスにしないこと
(他の方法もいくつか思いつきましたが諸事情で不採用にしました)

しかし、もしかしたら、これらのことを諦めずに解決するような、
私の知らない方法があるのかも知れません。

例えば、プラグマやコンパイルオプションなどで何かしら宣言すると、
エクスポートされていないの型や関数などが限定的に使えるとか。
cabal ファイルのTest-Suiteで何か宣言すればエクスポートの範囲が変化するとか。

何かないでしょうか。

811 :デフォルトの名無しさん:2015/03/11(水) 22:49:21.05 ID:LvC4ZRIJ
型名を公開すれば、型が合ってればどんな値でもバグらないというニュアンスになる

逆に、型名を非公開にする理由は、たとえ型が合っていても値が変わるだけで困るから
テストをする理由も同じ
型を諦める必要があるというか既にもう諦めてるから

812 :デフォルトの名無しさん:2015/03/11(水) 23:17:50.99 ID:ZHiGUb9Z
> 2. TX型やTY型をEq型クラスのインスタンスにしないこと

なにが困るのかがさっぱり。
どうしても嫌なら#ifdefでインスタンス宣言を括ってどうぞ。

813 :デフォルトの名無しさん:2015/03/12(木) 00:04:40.50 ID:QEc8icgi
何かを諦めれば簡単に解決する
でも別の解決策が欲しい
この設計思想がある解決策の梯子を外し別の解決策へ移行させようとする原因だった

814 :デフォルトの名無しさん:2015/03/12(木) 03:26:04.17 ID:XqLrTnef
>>810
2つ現実的な方法がある
1. Internalモジュールを作ってテストする
2. Eqインスタンスをエクスポートする(して何が困るの?

815 :デフォルトの名無しさん:2015/03/12(木) 20:13:40.54 ID:5VtmxQOa
みなさん、アドバイスありがとうございます。

アドバイスをもとに影響度合いなどいろいろ考えた結果、
型コンストラクタTYもエクスポートする方向でいくことにします。

Eqのインスタンスにして何が困るのかという話ですが、不都合は今のところ起こりません。
だから、この方法の >>810 で候補に挙げています。

ただ、アプリケーションを稼働させるには不必要なことです。
もしテスト方法を変えれば、本当に無意味な記述になります。

型コンストラクタTYもエクスポートする方法も同じです。

アーキテクチャレベルでテストしやすいよう考えるのは当然ですが、
今回のようなレベルでアプリケーションのソースがテストに依存するのは
どうも違和感あるというか、気持ち悪いです。

しかし、現実問題として言語仕様上どうしようもないので
「諦める」という表現を使いました。

816 :デフォルトの名無しさん:2015/03/12(木) 20:50:39.48 ID:5VtmxQOa
Haskellが使える環境がもどってきたので、
さっそく型コンストラクタTYもエクスポートする方法でやろうとしましたが、
これだけではエラーが出てダメでした。

型を定義したモジュール外で stand-alone deriving を使うには、
そのデータコンストラクタもエクスポートする必要がありました。

これではさすがにマズいので、TX型とTY型の両方を、
定義したモジュール内でEqクラスのインスタンスにする方法でやることにしました。
こちらの方がはるかにマシでした。

817 :デフォルトの名無しさん:2015/03/12(木) 21:10:17.71 ID:0zpeSjHe
優先順位を考えると
1. 無意味なものは許す
2. 有害なものは許容範囲内なら許す
3. 有害で許容範囲を超えたら許さない
なので無意味なものをわざわざ批判するとバランスがおかしくなると思う

818 :デフォルトの名無しさん:2015/03/13(金) 13:54:23.42 ID:LttjjwH8
花粉と免疫システムかな?

819 :デフォルトの名無しさん:2015/03/13(金) 19:39:29.07 ID:4mx0G3rL
おまえら移住せんの?

820 :デフォルトの名無しさん:2015/03/13(金) 19:43:32.40 ID:hUcCsH7s
Haskellの
emacsの設定て敷居高いですね

821 :デフォルトの名無しさん:2015/03/13(金) 20:41:50.68 ID:LttjjwH8
emacsに不義理でもしたのか

822 :デフォルトの名無しさん:2015/03/13(金) 21:21:48.64 ID:hUcCsH7s
↑なかなか中々上手く行かないんだわ 

823 :デフォルトの名無しさん:2015/03/13(金) 21:45:58.34 ID:lEcXR8jN
elispで充分

824 :デフォルトの名無しさん:2015/03/13(金) 22:12:50.10 ID:hUcCsH7s
↑意味が分かりません 

825 :デフォルトの名無しさん:2015/03/14(土) 00:04:18.42 ID:26umtMML
>>820-822
横レスすまんが、 >>821 は言葉の用法の間違い (というかもうそっちが定着してるから間違いとも言えんレベルだが)
を揶揄したものなのに華麗にスルーされててワロス

826 :デフォルトの名無しさん:2015/03/15(日) 08:08:17.22 ID:7pgtsg0r
Emacs厨はアスペ、はっきりわかんだね

827 :デフォルトの名無しさん:2015/03/15(日) 14:31:07.85 ID:HF4x7IBd
何層かある data の深いところの値を更新したいんだけど、
どうするのがエレガントだと思う?

data A = A {a1 :: B, a2 :: C}
data B = B {b1 :: D, b2 :: E}
data C = C {c1 :: D, c2 :: F}
data D = D {d1 :: Int}
data E = E {e1 :: String}
data F = F {f1 :: D}

例えば x = A (B ( D 1) (E "x")) (C (D 2) (F (D 3)))

g :: A -> Int -> A
g a = 「a の ...C (D n) ... のところの n を *10 しただけのA型の値を返す」

例えば g x は A (B ( D 1) (E "x")) (C (D 20) (F (D 3))) だ。

828 :デフォルトの名無しさん:2015/03/15(日) 14:32:56.30 ID:HF4x7IBd
>>827
ごめん、ミスった。

g :: A -> Int -> A の第2引数は無しで。

829 :デフォルトの名無しさん:2015/03/15(日) 14:58:59.46 ID:q9l2n6dJ
Lens使え。

830 :デフォルトの名無しさん:2015/03/15(日) 15:30:36.85 ID:A1oM2KXe
岡部健、自己弁護のみに始終。案の定、まったく反省していないことが判明
賭は俺の勝ち

http://kenokabe-techwriting.blogspot.jp/

831 :デフォルトの名無しさん:2015/03/15(日) 16:12:33.97 ID:wei4B/2R
刑事告訴されてるような岡部の言うことなんぞ真に受けるなよ

832 :デフォルトの名無しさん:2015/03/15(日) 22:41:18.42 ID:kXbqULDT
windows8.1→cigwin(mintty→ssh)→virtualbox上のUbuntu14.04→ghci
という環境でghciを使ってるのですが
ghci中のカーソルキーの入力がたまにおかしくなります
具体的には、↑がAやOA、↓がBやOB、→がCやOC、左がDやODという文字の入力になってしまいます
たまにというのは、ずっと→を押していると、不定期に数秒に一回DやODが入力されるような間隔です
こうなってしまう原因と解決方法に心当たりはありませんでしょうか?

ちなみに、ghciを起動していないubuntuのシェル(bash)では上記のようにはならず(ずっと→を押しても余計な文字は入力されず)正しく使えています

833 :デフォルトの名無しさん:2015/03/15(日) 22:42:40.17 ID:kXbqULDT
ghciのバージョンを記載し忘れました
aptから入れたもので、GHCi, version 7.6.3:です

834 :デフォルトの名無しさん:2015/03/15(日) 23:10:44.25 ID:HF4x7IBd
>>829
ありがとう。

おかげで楽にはなったが、data B はいろんなところで使える型として
値構築子やフィールドも公開しているんだよなぁ。
これのフィールドは他のところでは普通にアクセスしたいんだが、
Lens使うと前置詞としてのアンダーバーは強制なんだね。

幸い、深くアクセスするのはこれらの型を定義しているモジュール内でだけだから、
フィールド名の前後にアンダーバーを付けて、data B だけは
そのフィールド名のアンダーバーを取っ払った名前のアクセス関数を
改めて作って公開することにしたよ。

835 :デフォルトの名無しさん:2015/03/16(月) 05:01:14.76 ID:5XnXSgrq
>>830
岡部健のネタはもうやめろ

836 :デフォルトの名無しさん:2015/03/16(月) 09:21:16.09 ID:IRjKOJtG
lens関数作って自分で作ればええやろ、アホらし

837 :デフォルトの名無しさん:2015/03/16(月) 12:07:52.37 ID:Neeu70ky
最近、このスレの住人も毛の壁ナイズされてきてるような・・・・

838 :デフォルトの名無しさん:2015/03/16(月) 17:17:22.31 ID:jh0egios
kenokabeチルドレン

839 :デフォルトの名無しさん:2015/03/16(月) 20:19:53.52 ID:OhH2Zqat
cabal build を使って自作アプリや自作ライブラリをビルドしています。

cabal ファイルを作って cabal configure したとき、下記の警告が出ます(改行は私が入れた)。

Warning: This package indirectly depends on multiple versions of the same package.
This is highly likely to cause a comple failure.

この後ろに、パッケージの依存関係が列挙されています。
例えば regex-base-0.93.2 は mtl-2.1.3.1 に依存していますが、
exceptions-0.8.0.2 は mtl-2.2.1 に依存しているようです。

この警告はこちらの努力で解消できる(すべき)ものなのでしょうか。
それとも、コンパイルが通るならとりあえず無視して良い(それ以外に無い)のでしょうか。

840 :デフォルトの名無しさん:2015/03/16(月) 20:33:56.85 ID:E+TaWzS7
2.1.3.1「以上」に依存してるはずだが、そうじゃなきゃ
Regex-baseに特別な事情がない限りパッケージングのミスだろ。
なんとでも好きなようにしたらいい。

841 :デフォルトの名無しさん:2015/03/16(月) 20:45:42.28 ID:OhH2Zqat
>>840
> 2.1.3.1「以上」に依存してるはずだが、

Hackage で regex-base の Package description を見てみましたが、
Build-Depends にある mtl にはバージョン範囲の指定はありませんでした。
(というより、base 以外は範囲指定はないです)

これが、パッケージングのミスというものでしょうか。

842 :デフォルトの名無しさん:2015/03/16(月) 21:04:55.89 ID:E+TaWzS7
だいたいわかったが、自分で調べて解決したほうがためになるな。
ウォーニング放置しても無害なんだし、解決したきゃ努力せよ。

843 :デフォルトの名無しさん:2015/03/16(月) 21:07:03.64 ID:OhH2Zqat
>>842
わかりました。
ありがとうございました。

844 :デフォルトの名無しさん:2015/03/17(火) 20:27:35.71 ID:FrSWu1Dj
>>842
調べてみました。

cabal ファイルの build-depends にあるパッケージに、バージョンの制限が書かれていないと、
どのバージョンでも認めることを表明していることになる、
ということが分かりました。

exceptions の方には build-depends にちゃんとバージョンの制限が書かれていることも分かりました。


以下は私の推測です。

regex-base の後に exceptions がインストールされ、
その間に別のパッケージのインストール時に必要性から mtl がアップデートされていた。
regex-base のインストール時の mtl のバージョンは 2.1.3.1 だったが、
exceptions のインストール時には 2.2.1 だった。

しかし、この推測だと、警告される理由がまだ分かりません。
regex-base はどのバージョンの mtl でも問題ないと言っている。
少なくとも cabal configure はそう捉えるはず。
(でなければ、何のための build-depends の記述か分からない)
それなら、なぜ高い可能性で compile failure を起こすと警告するのか。
問題ないのに。

私の環境では mtl に依存しているパッケージで 2.1.3.1 に依存しているのは regex-base のみで、
他のパッケージは全て 2.2.1 に依存しています。
なので、余計に警告の意味が分かりません。

845 :岡部 健:2015/03/18(水) 16:11:13.47 ID:WIL/PpJs
やっぱり僕は王道をゆくソープランド!

846 :デフォルトの名無しさん:2015/03/18(水) 23:25:07.18 ID:FNOxTMt1
>>416
なりすまし氏ね!

847 :デフォルトの名無しさん:2015/03/19(木) 13:07:40.79 ID:Mi/YioFJ
haskellは初心者でも扱いやすくて
エンジニアの確保が容易で
安定した信頼性の高いプログラムが作れる
高い生産性が期待できる言語です

みたいな感じでjavaみたいな売り込みかたしようよ

848 :デフォルトの名無しさん:2015/03/19(木) 13:22:53.73 ID:u8piOzKi
半分は詐欺なんですがそれは

849 :デフォルトの名無しさん:2015/03/19(木) 20:09:10.86 ID:ghSRX08t
初心者に安定した信頼性の高いプログラムなんか組めんよ
製品に組み込んだ途端にスペースリークしまくるのがオチ
結局、旧来の言語・パラダイムに精通した熟練者が必要になる

850 :デフォルトの名無しさん:2015/03/19(木) 22:33:33.17 ID:W/Yj+6+X
>>847
計算理論をチューリングマシーンじゃなくて、λ計算や帰納関数をメインに教えるように大学がカリキュラムを組めばなんとか…

851 :デフォルトの名無しさん:2015/03/19(木) 22:49:52.83 ID:IhfgyQoX
旧来の言語やパラダイムの熟練者といっても、自称熟練者だと、
人によっては Haskellでスペースリークをよく起こす。

たとえば下記の2番目のコードを得意げに書いて、それが本当に最適化になっているのか、
指摘されるまで一度も考えようとしない人を何度も見てきた。

課題 : length を自作せよ f :: [a] -> a

改善前
f [] = 0
f (x:xs) = 1 + f xs

本人にとっては処理速度やメモリスペースを改善したつもり
f xs = g 0 xs
 where g n [] = n
    g n (x:xs) = (n + 1) xs

指摘しても、また同じことを繰り返す。

852 :デフォルトの名無しさん:2015/03/19(木) 23:09:15.27 ID:W/Yj+6+X
だからと言って seq を使う解決策に飛びついてほしくない

853 :デフォルトの名無しさん:2015/03/19(木) 23:35:35.95 ID:IhfgyQoX
>>852
私もそう思うが、>>851 で私が問題にしたのは、
評価の仕組みを自分の頭で考えようとせず、
これでいいだろうと思い込んでいること。

自称熟練者はいろんな本を読んで方法には精通しているが、
背景や理論には背を向けてきたからね。

初心者か、旧来言語の熟練者かに関係なく、
自分が組んだプラグラムが動く仕組みに常に関心を持って、
面倒くさがらずに深く考えられる人が、
安定した信頼性の高いものを作るんだと思う。
初心者は初心者なりの規模で、熟練者は熟練者なりの規模でね。

854 :デフォルトの名無しさん:2015/03/20(金) 01:11:37.73 ID:kRGTPNvL
どうでもいいけど>>851のコードが間違っているのは確かに恥ずかしいと思う。

855 :デフォルトの名無しさん:2015/03/20(金) 01:47:43.09 ID:GPN1Pmpt
岡部健がWikipediaでまだFXSTという名前を名乗っていた頃、いくらアカウントを凍結されても別のアカウントを取り直して、
長文演説を続けていた。あの頃の岡部、俺は大好きだ。
俺は粘着軍なんかとは違う。純粋に岡部のファンなんだよ。

856 :デフォルトの名無しさん:2015/03/20(金) 15:14:15.92 ID:kIK8wyTb
スペースリークとかいうしょうもない例を出して、知識の深さの問題を考え方の問題に擦り替えて叩きたいのは分かった。

857 :デフォルトの名無しさん:2015/03/20(金) 18:42:25.65 ID:+SAQAguo
読みやすいコードを書いてくれるか、読みやすさを重視してくれているなら十分でございます
上の例なら「末尾再帰にすればスタック領域使わなくなるからオススメよ」と言うだけで良いのでストレスにもなりません。

そういう意味では.を駆使したポイントフリースタイルは読みづらいです。右から左に読むので普段と逆になってしまいます。

858 :デフォルトの名無しさん:2015/03/20(金) 18:51:50.40 ID:kRGTPNvL
>>857
>そういう意味では.を駆使したポイントフリースタイルは読みづらいです。右から左に読むので普段と逆になってしまいます。

ポイントフリースタイルが読み辛いのは事実だが、これは意味不明。
関数の連鎖はどうやったって右から左に読むだろ。
普段コードを右から左に書いていくのに慣れてれば、別にそれで読みにくくはない。

859 :デフォルトの名無しさん:2015/03/20(金) 20:35:44.50 ID:kIK8wyTb
なんでどうでもいいことにみんなこだわるのか

860 :デフォルトの名無しさん:2015/03/20(金) 20:52:37.64 ID:oneN4TcS
どうでもいいと思っている事にこだわる人はいない
こだわるにはそれだけの理由がある

861 :デフォルトの名無しさん:2015/03/20(金) 22:11:18.10 ID:+SAQAguo
ごめんよOCamlの|>とHaskellの$を取り違えてました。haskellの f3 $ f2 $ f1 x も右から左でしたわ
OCamlのf1 x |> f2 |> f3 とするのが自分には合っていただけだった。
例えばテキスト読み込んで行ごとに分けてーって考えながらタイプしてると|>が便利でな…

今書いてて思ったのだけど、>>=より=<<の方が読み方向の一貫性が出ないでしょうか

862 :デフォルトの名無しさん:2015/03/20(金) 22:38:22.21 ID:kIK8wyTb
>指摘されるまで一度も考えようとしない人を何度も見てきた。
課題 : length を自作せよ f :: [a] -> a

おかしいと思わなかったんだろうか、この型。もう少し考えてコード書こうよ。

863 :デフォルトの名無しさん:2015/03/20(金) 23:25:25.12 ID:oneN4TcS
>>861
あくまで俺個人の感覚だけど

関数合成(・)や関数結合($)は引数への関数の適用だから、
書く方向と適用の順番が逆なのはなんの違和感もない。
数学で関数の式を書いていて違和感ないのと同じ。

一方、モナドのバインドは意味的には何かを適用してるのではなく、
計算の流れを表しているから、書く方向がそのまま流れと一致してほしい。
だから、>>= の方がきもちいい。


俺としては、むしろアロー表記の方向が気持ち悪い。
アローの説明でよく回路図みたいなのが出てくるが、
あれはみんな左から右へ流れるように描くのに。

864 :デフォルトの名無しさん:2015/03/21(土) 00:30:01.27 ID:rS60ZlVd
>>862
lengthを自作せよ、で"f"に型を付けてるのも笑いどころ。
しかも、蓄積子使ってる方のコードは再帰になってない&当然型が合ってないというお笑いぶり。
この人、Haskell書いたことないんだろうな、と。

865 :デフォルトの名無しさん:2015/03/21(土) 12:12:38.77 ID:vO/f2A+C
好きに書けよ。なんなら下から上に書いても構わんぞ

866 :デフォルトの名無しさん:2015/03/21(土) 12:37:55.98 ID:iwfo5L6e
細かく関数を書いていくから
わりと下から上になるな

867 :デフォルトの名無しさん:2015/03/21(土) 21:27:50.79 ID:+UFWZYTk
https://github.com/kenokabe/ubuntu-zsh-custom/blob/master/custom.zsh#L5
Think different? by 2ch.net/bbspink.com

868 :デフォルトの名無しさん:2015/03/23(月) 02:36:09.56 ID:ed0qti8j
モナドいいよね

869 :デフォルトの名無しさん:2015/03/23(月) 23:24:20.34 ID:bdXDdAXW
>>868
どこがだよw

870 :デフォルトの名無しさん:2015/03/24(火) 11:53:09.11 ID:n7Lq3ZiO
>>869
計算理論むき出しの感じがいい

871 :デフォルトの名無しさん:2015/03/24(火) 19:25:08.43 ID:+bpB/1qX
haskellは初心者お断りで
適当に書くとお前はわかってないと
言語とコミュニティからダメだしされるイメージ

872 :デフォルトの名無しさん:2015/03/25(水) 00:06:23.08 ID:Trr74Hk3
適当でも書けますよーとか無責任に布教してるの見るとなんだかなあってなるのは分かる

873 :デフォルトの名無しさん:2015/03/25(水) 03:44:11.08 ID:vS24XCcs
そのような記述はあまり目にしたことがないのですが、
サイト名とか具体的に挙げてもらえませんか?

874 :デフォルトの名無しさん:2015/03/25(水) 04:20:31.37 ID:Trr74Hk3
>>873
Twitter

875 :デフォルトの名無しさん:2015/03/25(水) 08:17:46.15 ID:TFTiCugB
「適当」が「手抜き」の意味で使われるのって、誤用だよなあ。

876 :デフォルトの名無しさん:2015/03/25(水) 09:53:03.83 ID:57C2efn3
手抜きしても適当 (妥当性があるという意味で) になる Haskell 最強

877 :デフォルトの名無しさん:2015/03/25(水) 09:58:56.49 ID:z1y3EjAR
着々と第2のLisp化しつある
立ち位置的な意味で

878 :デフォルトの名無しさん:2015/03/25(水) 12:27:54.98 ID:02y6cbqk
LispはHaskellのことを、可愛い子猫ちゃんだがやんちゃ過ぎて手に負えないと思っている

879 :デフォルトの名無しさん:2015/03/25(水) 13:30:58.36 ID:MLqzq6nP
就職してアサートまみれのコードを見たら、自分がこれまで使ってきたC言語のコードも適当だったと気付く

880 :デフォルトの名無しさん:2015/03/25(水) 15:09:50.36 ID:B13xpX6A
ライブラリ揃えばみんな使うという幻想

881 :デフォルトの名無しさん:2015/03/25(水) 18:07:16.13 ID:AUDsLf9R
まず言語仕様が揃わないことにはお話にもならない

882 :デフォルトの名無しさん:2015/03/25(水) 22:21:50.58 ID:PsNUsr4x
haskell コミュニティは初心者にすごく優しいイメージがある
自由なテキストが多かったり haskell wiki が充実してたりするためかもしれない

883 :デフォルトの名無しさん:2015/03/25(水) 22:30:38.72 ID:7CQuP5AA
GHCって着実にバージョンアップを繰り返していると思うけど、
生成物の実効速度○○%Upとかいう話はないね。
リリースノートにも書かれてないと思う。

スピードはあまり気にしていないのかな。

884 :デフォルトの名無しさん:2015/03/26(木) 09:38:50.60 ID:lJQgNJuE
GC言語な時点でスピードは諦めろ
C/C++に勝てると思うな
それでもHaskellは健闘している
大抵のことはスピードよりも持続可能な開発が尊重される
お前の計算機科学的特性も世界保全戦略に同化される。抵抗は無意味だ

885 :デフォルトの名無しさん:2015/03/26(木) 20:20:47.85 ID:6b6jz8AL
>>884
実行効率でCに勝とうとか、そんな無謀なことは思ってないよ。

ただ、これだけ処理速度が上がりました、これだけ使用メモリがへりました、
というレポートはなんで無いんだろうと単純に思っただけ。

(持続可能な開発がこのように改善されました、という報告も無いけどね)

最後の行は理解できませんでした。

886 :デフォルトの名無しさん:2015/03/27(金) 03:25:57.58 ID:9yTIqLKd
おい、例の岡部健がまたおかしな逃げ対応やらかしてるぞ

http://kenokabe-techwriting.blogspot.com/2015/03/qiita.html?showComment=1427367112199&m=1#c8379287369018080353

887 :デフォルトの名無しさん:2015/03/27(金) 10:01:50.26 ID:HpVN79Nq
専用のスレあんだろ

888 :デフォルトの名無しさん:2015/03/27(金) 16:18:48.97 ID:2D781VI+
日本の恥部毛の壁、世界へ大公開
http://stackoverflow.com/users/1028880/ken-okabe

889 :デフォルトの名無しさん:2015/03/28(土) 12:51:17.88 ID:am8aByMw
君達、代々のHaskellスレに顔向けできるかね?
今のていたらくは何だ

890 :デフォルトの名無しさん:2015/03/28(土) 20:53:55.86 ID:4WENvZ8m
代々のhaskellスレってモナドモナドと言葉が大きい曖昧なことしか議論できなかった馬鹿ばっかじゃねえか。
あいつらのうちどれだけがIO型をIOモナドと呼ぶことの弊害を理解していたのか。

891 :デフォルトの名無しさん:2015/03/28(土) 21:52:47.32 ID:V1hOllOl
御先祖様に唾を吐くか!

892 :デフォルトの名無しさん:2015/03/28(土) 22:55:26.85 ID:1qDJ7oSy
この手の言語のユーザは2chよりTwitterを好む傾向があるからそっちに行った方がいい

893 :デフォルトの名無しさん:2015/03/28(土) 23:26:05.51 ID:eJyl6Yy2
>>890
具体的にどんな弊害があったの?

894 :デフォルトの名無しさん:2015/03/29(日) 00:32:58.82 ID:B+lgx0sX
>>893
ttp://blog.jle.im/entry/io-monad-considered-harmful
を読みなさい、と言おうと思ったが読めないな今。自分が言えることは

1. IO型で副作用を扱えるのはモナドだからではない。
2. ブラックボックス化されたコンテナの中身に安全にアクセスする方法を作ったら数学で言うモナドと呼べるものになった。
 学ぶ順序を逆にして惑わせるのが先人のすることか?あいつマクレーン読みだしたぞ。
3. 数学的構造であるモナドの定義を理解しても、各種型をどうモナドとみなしているのかは分からない。
 型に帯するモナドは一意に決まるというわけではない。
4. だからインスタンスを1つずつ理解しないといけない。
 モナドはCのポインタやOOPのデザインパターンのような、それが分かれば具体例も簡単に理解できるという類のものではない。

あたかも「モナドを理解すればIOが分かる」かのような印象を与えるような、IO型をIOモナドとわざわざ言うのは害悪。
「純粋関数型で副作用を扱うにはモナドが要る」とか言っちゃう人がいる。
「モナドを勉強しなきゃ」とか思ってしまう初心者がいる。そんなドロ舟に乗せたい奴がIOモナドとスノッブ丸出しの用語を使う。弊害じゃきゃ何なんだ。

895 :デフォルトの名無しさん:2015/03/29(日) 02:37:49.08 ID:jcoheZvF
整数を整数環と呼んだために
(整数を知らない人が)整数を理解しようとして
環論を勉強し始めるようなものだ
ってことか

896 :デフォルトの名無しさん:2015/03/29(日) 04:21:36.17 ID:jJf5qR8c
圏論を勉強する必要ないのはそのとおりだけど、
型クラスとしてのアプリカティヴやモナドの挙動は理解しないと
いずれにせよ現状のHaskellでIOはまともに扱えないだろ。

裏で状態を受渡してるのを隠蔽するという
よくあるタイプのモナドの使い方のひとつ
(そしてそれは一意型ほどclumsyでない)、
という事情はむしろ強調してしかるべき。

897 :デフォルトの名無しさん:2015/03/29(日) 04:52:21.52 ID:+wVq29XI
今思うと、毛の壁の説には一理あるよな

898 :デフォルトの名無しさん:2015/03/29(日) 09:31:34.21 ID:B+lgx0sX
>>895そのとおり。一番の害は「モナド自体を(すなわち圏論を)学べば各インスタンスの意味が簡単に分かるようになる」という誤解を招くこと。
整数の定理を勉強したい人に「整数はzipper構造を使ったチャーチ数の亜種である」と言えることを教えたって無意味。
モナド自体に勉強する価値をもたせたいなら、例えば関数をベクトルとみなすことでフーリエ変換やz変換が上手に説明できる、というくらいには、その抽象化でどうして便利になるのかというメリットを説明できないといけない。

>>896 ある物の挙動を理解させるのに定義を教えず、挙動だけ教えろって?
義務教育なら(頭を対象に慣れさせるためにも)そのアプローチは理に適っているが、
モナドに関して定義->定理->実例という学習プロセスが何故迂遠なのかをどう教える?
如何に遠回りかの説明に骨を砕かないと初学者がマクレーン読み出すぞ。

そもそも「状態を隠蔽する」のに最も寄与しているのは型コンストラクタの隠蔽であって、
問題の根幹は、状態が隠蔽されている型に対し如何にしてアクセスすればいいのか、どのような操作を認めるべきでどのような操作を認めてはいけないのか、という部分にある。
最後に「それをまとめたらモナドと呼べるものになった」とか付け加えたらやっぱりマクレーンを読ませようと誘惑していることになる。

899 :デフォルトの名無しさん:2015/03/29(日) 09:48:42.09 ID:RiJnnk6J
>>898
圏論の教科書がMacLaneぐらいしかなかった時代と違って今は色々
わかりやすい読み物があるので、圏論的なモナドの話は別に難しくなく、
むしろ普通のOOPには現れない「振る舞いによる法則」レベルの抽象化
であることがよく理解できるので、IO「モナド」というのが有害というのは
納得いかんなあ。

「振る舞いによる法則」を理解しても個々のモナドの振る舞いは個別に
学ばねばならないことは同意。

900 :デフォルトの名無しさん:2015/03/29(日) 10:42:24.05 ID:PO6Lt1kK
初心者にはもっと実用的なアプリケーションを作らせまくるべきでは?

Evernote からノートの文字列を取得する程度の小粒アプリから、
シンプルな格ゲー程度の中型アプリまで、まずは十数個ほど作らせて、
胸張って中級者と言えるようにする。

上級者向けのモナドの意味や理論などのトピックはその後でしょ。

あくまでプログラミング言語なんだから、コンピューターを制御してなんぼ。
アプリが作れなければ、理論を学んでも使えない。

入門書にはこの順番を間違えないでほしいといつも思う。

901 :デフォルトの名無しさん:2015/03/29(日) 11:27:33.84 ID:B+lgx0sX
>>899 どのテキストが良かった?教えて下さい。
あと「振る舞いの法則」ってのも具体的には何なのか教えて下さい。

902 :デフォルトの名無しさん:2015/03/30(月) 00:02:31.08 ID:odnzVWCg
>>900
ttp://haskell-distributed.github.io/
今どき、ゲームなんて費用対効果の悪いもの作るマヌケ居るわけ?

903 :デフォルトの名無しさん:2015/03/30(月) 06:51:05.89 ID:pIvnNKWO
>>902
費用対効果の高さを学んでもらうのが狙いじゃないから

904 :デフォルトの名無しさん:2015/03/30(月) 10:43:49.86 ID:kVQ7S1yd
でも IO monad って最初に言ってくれるから return 1 :: [Int] とかもすんなり理解できるみたいなことはある

905 :デフォルトの名無しさん:2015/03/30(月) 11:27:03.19 ID:YgdRSR6f
何であるかじゃなくてどう動くかとかどう使うかに絞った入門書は確かに欲しい

906 :デフォルトの名無しさん:2015/03/30(月) 14:44:06.44 ID:odnzVWCg
>>903
オマエ、格ゲーなんて作ったことないだろw
少しでもプログラミングを齧った連中は、
今もう書籍なんか読まずにOSSのコード取ってきてプリントアウトするから

907 :デフォルトの名無しさん:2015/03/30(月) 15:56:12.59 ID:TUvaAE9z
インクの一滴、血の一滴。

908 :デフォルトの名無しさん:2015/03/30(月) 17:27:11.14 ID:461j1ZwJ
ストレージには暗号化した状態で保存し、読み出したら厳密にメモリ内のみで復号(仮想記憶NG)するようなセキュアな入出力をするにはどうしますか?

909 :デフォルトの名無しさん:2015/03/30(月) 19:02:16.70 ID:s2KoJfya
FFI使う。

910 :デフォルトの名無しさん:2015/03/30(月) 20:53:33.08 ID:pIvnNKWO
>>906
残念ながら、今はまだHaskellでそれができる状況にはないと俺は思ってる。

CやJavaやPythonなど、いくつかの他言語ならいいけど。

911 :デフォルトの名無しさん:2015/03/30(月) 22:28:08.40 ID:odnzVWCg
>>910
オマエに出来ないだけで、既にグラディウスやマリオのcloneを作ったプログラマなら幾らでもいるからね

912 :デフォルトの名無しさん:2015/03/30(月) 23:03:53.92 ID:pIvnNKWO
>>911
それらは、Haskellによるアプリ作りとはこういうものなんだ、
と言えるような、「初心者が学ぶ」のに良い題材なのか?

グラディウスのクローンってモナディウスのことだよね。
あれ、作者自身があまり参考にしてほしくないようなことを言ってなかったか?
ソースを読んだことあるが、全体的にHaskellに翻訳しました的なものだったと記憶してる。
(作者や作品を貶しているわけではない。あくまで初心者が真似して良いかという観点)

その点、darcs なんかは比較的宣言的で綺麗なんだが、いかんせん、規模が大きい。

初心者に適した題材の実例がないような気がする。
もちろん、俺が知らないだけだろうから、何かかあるのなら挙げるといい。
それを見て真似る初心者がたくさん現れれば素晴らしいことだから。

913 :デフォルトの名無しさん:2015/03/30(月) 23:47:26.03 ID:odnzVWCg
>>912
>>900
>上級者向けのモナドの意味や理論などのトピックはその後でしょ。

914 :デフォルトの名無しさん:2015/03/30(月) 23:56:03.68 ID:pIvnNKWO
>>912
ちょっと誤解を与えそうな表現だったから訂正させてほしい。

> 「初心者が学ぶ」のに良い題材なのか?

題材じゃないな。

「初心者が学ぶ」のに良い資料なのか?


>>913
宣言的に書かれた良いソースを「真似て書く」のと、
その美しさを支えるモナドなどの「理論を学ぶ」のは別だよ。
初心者は真似まくってスタイルを体出覚えた方がいいと私は思う。
理屈はその後。


ちなみに、私はHaskellでは理論や小手先のテクニックばかり追いかけて、
初心者のうちにアプリをほとんど作ってこなかった事を非常に後悔している。
理論が邪魔して、実力に見合った規模のアプリを実力に見合った作り方でなかなか作れないでいる。

915 :デフォルトの名無しさん:2015/03/31(火) 00:42:54.95 ID:tAAH49rk
>>914
>理論が邪魔して、実力に見合った規模のアプリを実力に見合った作り方でなかなか作れないでいる。

それは実力がないだけ。
まさにそれがあなたの実力。

916 :デフォルトの名無しさん:2015/03/31(火) 00:46:22.39 ID:UgHipcgW
定義上、半数の人は平均以下。

917 :デフォルトの名無しさん:2015/03/31(火) 01:56:07.61 ID:xBEas+F+
>>914
>理論が邪魔して、実力に見合った規模のアプリを実力に見合った作り方でなかなか作れないでいる。
ああ居るよね。そういう人。c++の本を書くために家を売ってドワンゴに就職したヤツとか
perlやjavascriptの瑣末を追っかけてた人とか。だから、結局は皆、PHPとcを選ぶんだ

918 :デフォルトの名無しさん:2015/03/31(火) 06:16:20.74 ID:PitBeDzA
>>916
それ平均値じゃなくて中央値な

919 :デフォルトの名無しさん:2015/03/31(火) 07:07:10.53 ID:UgHipcgW
>>918
ちゃんと「平均以下」とあいまいに言ってるよ。

920 :デフォルトの名無しさん:2015/03/31(火) 07:48:29.02 ID:lJu1LRNc
だーかーらーモナドの理論って何のことよ?
各自が持っている曖昧なイメージを理論なんて呼んでいるのか?
それとも俺が知らない素敵な圏論の定理があってそれを使うとびっくりするような機能を実現できるのか?
数学ではギリシャ文字がよく出てくるからギリシャ語を学びましょうってか?頭がお詳しいなこの野郎。

921 :デフォルトの名無しさん:2015/03/31(火) 08:50:13.03 ID:tAAH49rk
>>920
>それとも俺が知らない素敵な圏論の定理があってそれを使うとびっくりするような機能を実現できるのか?

せいぜいのところ型遊びするときに米田の補題が役に立つときがある、くらいだよなあ。

922 :デフォルトの名無しさん:2015/03/31(火) 08:54:40.14 ID:tAAH49rk
>>919
>ちゃんと「平均以下」とあいまいに言ってるよ。

ほんとになんもわかってねーのか?
0点1人と100点99人がいる場合に平均=99点以下なのは1人だけだろうがw

923 :デフォルトの名無しさん:2015/03/31(火) 09:48:18.38 ID:+3W0JsEP
>>917
>c++の本を書くために家を売ってドワンゴに就職

なにそれこわい

924 :デフォルトの名無しさん:2015/03/31(火) 10:29:13.67 ID:qMwd6CaF
363 名無しさん@ゴーゴーゴーゴー! 2015/03/30(月) 14:27:12.37 ID:GVZeelFD0
https://plus.google.com/102413788769460359022/posts/44Urws3T7je

925 :デフォルトの名無しさん:2015/03/31(火) 12:35:15.03 ID:V49MH64n
IOモナドで副作用的な入出力ができるのは、mainの型がIO aだからだろ?
個人的には、言語ランタイム(mainの呼び出し元)からずりずりケーブル引きずって制御パネルを
持ち歩いているイメージ。
そして、それ(ケーブルを引きずる)を可能にしているのがモナドの代数的性質。
純粋な関数で入出力ができないのはそういうことだと理解している。

926 :デフォルトの名無しさん:2015/03/31(火) 14:20:13.95 ID:8nbXovb7
>>920
Cのトランスレータで使うときに爆発的に役立つ

927 :デフォルトの名無しさん:2015/03/31(火) 14:25:28.69 ID:G4CzsdzS
>>925
俺もそれと同じ
その理解で全く問題なくプログラミングできてる

それ以上の理解なんていらんよ
あっても害はないけど、不必要だし、余計な手間

928 :デフォルトの名無しさん:2015/03/31(火) 14:42:18.73 ID:meXl7bV+
実際のところの要不要がどうなのかは知らんけど
さすがに「それ以上の理解」がない人が
不要とか手間とか言っても全く説得力がない

929 :デフォルトの名無しさん:2015/03/31(火) 15:46:49.29 ID:vkwjJNkO
>>928
まぁ、確かにそりゃそうだが

でも実際プログラミングできてるし、
簡単な家計簿ソフトとか倉庫番ゲームとか問題なく作れるし

これ以上IOモナドの何を理解する必要があるって言うのさ

930 :デフォルトの名無しさん:2015/03/31(火) 16:02:00.60 ID:HBUStIw1
Haskellは論文を書くための言語であって、プログラミングのための言語ではないんでしょ

931 :デフォルトの名無しさん:2015/03/31(火) 16:17:11.48 ID:vkwjJNkO
そんな迷信信じてる人なんていないよ

932 :デフォルトの名無しさん:2015/03/31(火) 17:39:02.38 ID:1d6g1tI6
いつの時代からタイムスリップしてきたのかな?

933 :デフォルトの名無しさん:2015/03/31(火) 18:40:00.15 ID:meXl7bV+
>>929
アセンブラでプログラムが書ける人が「これ以上何を理解する必要があるって言うのさ」と言ってるのと同じ

934 :デフォルトの名無しさん:2015/03/31(火) 19:06:19.12 ID:TsIo80bl
>>933
じゃあIOモナドについて、どんなソフトを作るのに、
>>925 以上のどんな理解が必要になるの?

935 :デフォルトの名無しさん:2015/03/31(火) 19:28:50.39 ID:tAAH49rk
計算量のオーダーを下げるためにCPS変換するとき。

936 :デフォルトの名無しさん:2015/03/31(火) 20:01:44.46 ID:hBYt1SAS
リアルタイムのソフトを作ったことが無いと、そういう理解になっちゃうわけか。

937 :デフォルトの名無しさん:2015/03/31(火) 20:10:16.88 ID:TsIo80bl
お願い、もっと具体的に

>>925 の理解では >>935>>936 をプログラムできない、あるいは非効率な理由を

938 :デフォルトの名無しさん:2015/03/31(火) 20:31:38.01 ID:xBEas+F+
>>923
本の虫。Larryだって、リバースモゲージで生きてたんだよ
僕は素敵なHaskell入門書が世に出版されるのを、じっと見守ろうと思う

939 :デフォルトの名無しさん:2015/03/31(火) 20:38:33.87 ID:tAAH49rk
>>937
具体的にもなにも、まさに件の程度の理解でCPS変換やって
計算量のオーダー下げられるか試してみりゃいいじゃないの。

940 :デフォルトの名無しさん:2015/03/31(火) 21:28:57.81 ID:TsIo80bl
>>939
さっきから微妙に話が噛み合ってないような気がするんだが
もしかしてきみはモナドそのものに関わる理解の話をしていないか?

俺はIOモナドの理解の話をしているんだが

IOモナドを使ってプログラミングすることにおいて、
IOモナドの理解の深さとして >>925 では足りない例なのか >>935

941 :デフォルトの名無しさん:2015/03/31(火) 21:48:48.01 ID:O1cF667I
横からすまん。俺もいまいち理解しきれてないんだが
遅延評価のせいで実際の IO のタイミングやパフォーマンス向上の際に
独特の問題があるのは、 IO モナドの問題と言っていいのかな?

942 :デフォルトの名無しさん:2015/03/31(火) 21:54:55.41 ID:TsIo80bl
>>941
それは遅延評価の理解の問題だよ

IO特有の問題ではない

943 :デフォルトの名無しさん:2015/03/31(火) 23:05:53.41 ID:2kdyJZbM
>>941
遅延評価をいつどんな理由でぶった切ればいいかを教えてくれるのが並列並行Haskellだと思ってる

944 :デフォルトの名無しさん:2015/04/01(水) 02:18:54.75 ID:zLa3MADx
lazy IO is not lazy evaluation.

945 :デフォルトの名無しさん:2015/04/01(水) 21:07:27.62 ID:ZBGUyXKP
質問ではない。

946 :デフォルトの名無しさん:2015/04/02(木) 12:43:50.32 ID:INFrUse2
全部スタティックリンクして
バイナリ1つにできると思い込んでた
結構手間かかんだね

947 :デフォルトの名無しさん:2015/04/02(木) 16:40:51.14 ID:XQ7U1MLO
質問ではない

948 :デフォルトの名無しさん:2015/04/02(木) 23:40:28.76 ID:+/mwTHcA
今はっていうかだいぶ前から
lazy ioとかよりiterateeがうんたらって言ってるけど全然理解できない

949 :デフォルトの名無しさん:2015/04/03(金) 05:14:35.55 ID:1wzyyH4T
質問ではない

950 :デフォルトの名無しさん:2015/04/03(金) 11:34:20.31 ID:haP2HuDT
今日もhlintになじられて

951 :デフォルトの名無しさん:2015/04/03(金) 21:05:10.93 ID:6jSxnujl
詰問ではない

952 :デフォルトの名無しさん:2015/04/04(土) 17:46:47.54 ID:8tbUo2zR
モナドはひとつしかない
真のモナドは引き継がないと永遠に失われる
http://i.imgur.com/uoOXcy4.png

953 :デフォルトの名無しさん:2015/04/04(土) 20:24:26.19 ID:apqAsPxv
>>14
なりすまし氏ね!

954 :デフォルトの名無しさん:2015/04/05(日) 10:28:14.89 ID:6kmP5T9e
Yesod について質問です。

hamlet 準クォートと違い shamlet 準クォートは Type-safe URLs を扱え、
準クォートの記述の後にレンダラ関数を受け取ります。

この、レンダラ関数を受け取ることやレンダラ関数の型は
ライブラリドキュメントのどこを見れば分かるのでしょうか。


今回の件に限れば、入門書やWebの情報を見て分かったので問題ないのですが、
今後の学習のことを考えると、公式のドキュメントでも把握できる、
裏をとる能力が必要だと思い、質問しました。

955 :デフォルトの名無しさん:2015/04/05(日) 17:03:09.12 ID:/p4ZvisL
動的計画法のメモ用配列として使うArrayに関して
Data.Arrayだと動くのにData.Array.UnboxedのUArrayにしてアクセスするとa.exe: <<loop>>になる
Arrayの方で全要素にアクセスしても正しく結果を返す
どういう原因が考えられるだろうか

956 :デフォルトの名無しさん:2015/04/05(日) 21:00:54.28 ID:6kmP5T9e
>>955
一番良いのは、その問題のソースをどこかに公開することです。

大きすぎて難しいのならば、同じ問題が起きるより小さなソースを公開してはどうでしょうか。
例えばフィボナッチ数列(の動的計画法版)の出力でもその現象は起きますか。


実行時に <<loop>> と出力される現象をWebで検索して調べてみますと、
どうもごく単純な無限ループに陥っている場合に限るようです。
f = f + 1 などの引数のない再帰的な参照です(相互再帰も含む)。

話を聞く限りでは、array パッケージの方に問題があるようにしか思えませんが、
本当に「型を UArray から Array に変えただけ」で現象が治まるのでしょうか。

957 :デフォルトの名無しさん:2015/04/05(日) 21:37:06.88 ID:/p4ZvisL
すみません、確かにソースを示すべきでした

ideoneにてフィボナッチ数で試してみたところ、同様の現象が起きました
Array:http://ideone.com/hM6dzT
UArray:http://ideone.com/Yp01Xb
ソース上の差分は型名に"U"があるかないかの1byteの差ですが
実行するとUArrayの方は<<loop>>のランタイムエラーになってしまいます
ソースに問題がありそうでしょうか、見ていただきたいです

958 :デフォルトの名無しさん:2015/04/05(日) 22:45:55.70 ID:6kmP5T9e
>>957
UArray の構築途中に自己参照すると無限ループに陥ります。

a :: UArray Int Int
a = listArray (0, 1) [0, a ! 0]

理由は・・・ base と array のパッケージをDLしてソースを見てみましたが、
決定的なこと(単純な自己参照になっている証拠)は分かりませんでした。

おそらく、非ボックスなので配列全体が確定しないと参照できないから、
という辺りだろうとは思いますが。

959 :デフォルトの名無しさん:2015/04/05(日) 23:24:00.02 ID:/p4ZvisL
>>958
ありがとうございます
なるほどboxだと自己参照しても式を保持してるだけだから順にたどって評価できるけど
Unboxだと要素参照時に一気に全体を構築しようとするから構築中に参照すると再度全体を構築しようとして無限ループするってことですね
そういわれるとそうだなあとなんとなく想像できました

自分でもパッケージのソースを理解できるようになるよう勉強します。。

960 :デフォルトの名無しさん:2015/04/05(日) 23:28:49.66 ID:/p4ZvisL
書き忘れ
ということは動的計画法のメモもUArrayで高速化!と単純に使うことはできなさそうですね

961 :デフォルトの名無しさん:2015/04/06(月) 10:07:06.75 ID:z61IB+9E
へーはーほーん、ためになるわー

962 :デフォルトの名無しさん:2015/04/06(月) 21:52:51.93 ID:G/X3auvA
Linux に ghc-7.10.1 と cabal-install-1.22.2.0 をインストールして、
適当なパッケージも入れてみたんだが、
これ、ドキュメントのリンクが壊れてないか?

.cabal/share/doc/x86_64-linux-ghc-7.10.1/index.html
ここから辿れるはずのリンクが全て壊れてる。
たとえば Data.List のリンクは相対パス Data-List.html になってる。
つまり、.cabal/share/doc/x86_64-linux-ghc-7.10.1/Data-List.html になってしまっている。

.cabal/share/doc/x86_64-linux-ghc-7.10.1/doc-index.html
このインデックス(索引)ページから個々の関数へは何も問題なく辿れるが、
全然別の場所だ。
たとえば、Data.List.head 関数は
/usr/share/doc/ghc/html/libraries/base-4.8.0.0/Data-List.html#v:head
になっている。

これはどう言うことだろう。
.cabal/config の install-dirs user のセクションの項目は何も弄っていないんだが。

963 :デフォルトの名無しさん:2015/04/07(火) 21:21:56.30 ID:Dr0ZnCU/
そういうのはstackoverflowで聞いた方がいいんじゃないかな

964 :デフォルトの名無しさん:2015/04/07(火) 22:12:38.31 ID:5+CxwFaH
>>963
それならあっちで訊いてみようかと思ったが、もしやと思って以下のことを試したら、
問題なくドキュメントが見れるようになったから、もういいや。

/usr/share/doc/ghc/html/libraries にある各パッケージ内のファイルを
~/.cabal/share/doc/x86_64-linux-ghc-7.10.1 にコピー

.cabal/config の install-dirs user セクションの docdir の末尾 /$pkgid を削除
同セクションの htmldir の末尾 /html を削除
もちろん、両者ともコメントアウトを解除

適当なパッケージをインストール

965 :デフォルトの名無しさん:2015/04/08(水) 06:40:38.53 ID:lUVNN4o/
毛の壁、起訴されたらしいぞ

966 :デフォルトの名無しさん:2015/04/08(水) 12:14:11.41 ID:cDkL0Wby
2ちゃんねるの「なんちゃって関数型クラスタ」ども、これ読んで学び直せ

悔しかったらおまえらも本を出してみな?


http://www.amazon.co.jp/dp/4798043761

967 :デフォルトの名無しさん:2015/04/08(水) 14:18:25.17 ID:teBP6D43
今日まで生きていて秀和システムの本に金を出したことがないことをこれほど誇らしく思った日はないかもしれない

968 :デフォルトの名無しさん:2015/04/08(水) 14:56:31.55 ID:z4/H7LA9
>>966 ちょwww レビューが楽しいことになりそうだwww

969 :デフォルトの名無しさん:2015/04/08(水) 15:16:10.18 ID:2BNKspCq
秀和システムはあかん出版社だったか

970 :デフォルトの名無しさん:2015/04/08(水) 15:45:29.02 ID:tGwp3RJc
リンクを踏む前に予想した通りの著者名だった

971 :デフォルトの名無しさん:2015/04/08(水) 16:40:32.61 ID:YQenyVPn
このスレで爆笑したのは初めてかも知れない
スレチなのに

972 :デフォルトの名無しさん:2015/04/08(水) 16:51:12.44 ID:wxj4ghaM
刑事告訴されてて、まだ終わってないのに出版させるのも、どうなんだろう・・

973 :デフォルトの名無しさん:2015/04/08(水) 18:43:33.29 ID:TrrKWYIM
レアアイテム間違いない、買っとけ

974 :デフォルトの名無しさん:2015/04/08(水) 19:19:20.20 ID:mlk25XLU
(この物語はフィクションであり、実在の言語・技術・定理等とは関係がありません)

975 :デフォルトの名無しさん:2015/04/08(水) 20:09:43.19 ID:8XU2VIBh
kenokabeさん、出版おめでとうございます。これからも笑顔で楽しませてもらいます。
でも、誹謗中傷は良くないよー
今年の目標は、誤字脱字を無くすことかな?

976 :デフォルトの名無しさん:2015/04/08(水) 20:22:02.04 ID:2PDo66DT
騒動で名を売ったから結構売れそうだな

977 :デフォルトの名無しさん:2015/04/08(水) 20:51:44.99 ID:LkUjDtd8
この本平積みしてるかで書店の質が測れるリトマス試験本

978 :デフォルトの名無しさん:2015/04/08(水) 21:17:15.22 ID:teBP6D43
なぜお前らはリンク付きでこいつに言及しツイートしはてブすることで検索順位を押し上げようとするのか理解に苦しむ

979 :デフォルトの名無しさん:2015/04/08(水) 21:33:36.08 ID:5ufJn9r/
誰だよこのbot立てたのw
カイマイさんか?

ttps://twitter.com/_kenron_

980 :デフォルトの名無しさん:2015/04/08(水) 23:55:32.38 ID:myz0YUCE
もともとプログラミングの邦書はにわかが書いたような奴ばっかなのであまり驚かない

981 :デフォルトの名無しさん:2015/04/09(木) 03:23:41.65 ID:Ix9YNMr3
秀和がなんで刑事告訴されてるような奴の本を出す気になったのかが謎
http://d.hatena.ne.jp/hirono2011/touch/20140404/1397908870

982 :デフォルトの名無しさん:2015/04/09(木) 03:25:26.77 ID:Ix9YNMr3
検索してる人多そうなので、これ誰かリツイートしてよ

https://twitter.com/motoken_tw/status/452009450313097216

983 :デフォルトの名無しさん:2015/04/09(木) 03:29:53.42 ID:a98Ue6sT
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/    < 次のスレではもう岡部の話は禁止な
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\

984 :デフォルトの名無しさん:2015/04/09(木) 05:07:06.30 ID:QTbR1h7B
おまえら単に、岡部技師の才に嫉妬してるだけで、正当な反論もできないから、論点とは関係のないところから責め立ててるだけだろ?
下劣で品性の欠片も無いんだよ、下痢糞以下のゲロボケ野郎

985 :デフォルトの名無しさん:2015/04/09(木) 05:08:21.11 ID:QTbR1h7B
延々とコソコソ隠れて岡部技師を貶めてるのは下痢便駱駝だろ?クズが

986 :デフォルトの名無しさん:2015/04/09(木) 08:29:01.75 ID:4yjREsCN
https://twitter.com/tanakh/statuses/585756985750122496

987 :デフォルトの名無しさん:2015/04/09(木) 12:28:33.03 ID:SXMrA4Vi
関数型言語ってうさんくせーな
要するに現実の問題に対処できねーんだろ?

988 :デフォルトの名無しさん:2015/04/09(木) 12:31:34.64 ID:SXMrA4Vi
岡部技士ってなんだよ
典型的な意識高い系のクズじゃん

989 :デフォルトの名無しさん:2015/04/09(木) 12:35:27.62 ID:SXMrA4Vi
もしドラの作者もあんだけバカにされてたのに
同じ芸風でやるの?w

990 :デフォルトの名無しさん:2015/04/09(木) 17:34:56.45 ID:hKndZDCY
>>965
裁判費用は IQ145で美少女JKな先輩で稼ぐのか

991 :デフォルトの名無しさん:2015/04/09(木) 17:38:20.52 ID:hKndZDCY
アプリカティブ完全に理解した

992 :デフォルトの名無しさん:2015/04/09(木) 19:45:58.73 ID:4yjREsCN
http://web.archive.org/web/20130628214033/http://netbmari.seesaa.net/article/81337651.html

誰かこれ教えてやれよ

993 :デフォルトの名無しさん:2015/04/09(木) 19:54:35.43 ID:SXMrA4Vi
データ処理に向いてる気がするんだけど
レガシーシステムをなんとか救済してほしい

994 :デフォルトの名無しさん:2015/04/09(木) 22:38:50.14 ID:dWjcstD4
Stateモナドって状態を構造化したものじゃなくて状態付き「計算」(であるかのように見えるラムダ式のネストとbind)を構造化したもの
っていう認識であってる?

995 :デフォルトの名無しさん:2015/04/09(木) 23:01:23.83 ID:G0037DPx
その両者にどんな差があるというのだろう。

996 :デフォルトの名無しさん:2015/04/09(木) 23:18:03.23 ID:nCfbCjTA
>>994
どちらかが正しいと考えるのではなく、
様々な見方・考え方があることを受け入れることが大事だ。

片方しかないと思っていると、そちらの考え方で得られたかもしれないアイデア、
切り開かれたかもしれない新たな世界をみすみす逃すことになる。

あなたは、誰かからそれは計算の構造化の方が正しいと言われたら、
やっぱり思ってたとおりだ、と合点するのだろうか。
状態の構造化という考え方を捨て去るのだろうか。

997 :デフォルトの名無しさん:2015/04/09(木) 23:24:57.75 ID:G0037DPx
つうか表示意味論のレベルでは区別つかないだろ。

998 :デフォルトの名無しさん:2015/04/09(木) 23:29:36.04 ID:dWjcstD4
言葉足らずですまん
状態=変更可能なデータ構造の一種
で読み替えて貰えると

999 :デフォルトの名無しさん:2015/04/09(木) 23:34:38.52 ID:HP7+XEL9
変更可能なデータ構造の一種のように見える計算

1000 :デフォルトの名無しさん:2015/04/09(木) 23:40:47.32 ID:c5VDj6mj
 
Gun = Kata

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

289 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)