トップページtech
1001コメント316KB

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2013/01/21(月) 02:16:16.07
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0809デフォルトの名無しさん2013/03/15(金) 00:11:39.94
噛み砕いて書いたと思いきや繰り返して同じこと書いてるだけだった
0810デフォルトの名無しさん2013/03/15(金) 00:14:00.44
>>801
GOTOしての関数呼び出しと、GOTOとしてのλ式の違いは、GOTOが制御を奪えるかどうか
GOTOとしてのλ式はフローや繰り返しの最中で制御を横取りできてしまう
0811デフォルトの名無しさん2013/03/15(金) 00:15:31.38
>>806
>>763の第一項目(goto)の話をしてるんだが
0812デフォルトの名無しさん2013/03/15(金) 00:17:05.88
多分この人、プログラミングじゃなくて文学とかの方が向いてる
0813デフォルトの名無しさん2013/03/15(金) 00:24:32.25
せめて具体例とかつけてくれよ
0814デフォルトの名無しさん2013/03/15(金) 00:33:09.83
>>806
>・OOPでは、個性のないクロージャがオブジェクトに抽象化されてオブジェクト自身が持ちまわされるが、グローバル変数に代入する場合にはそれが難しい
いやいやオブジェクト云々は問題が起きる理由の一つでしょ?それを否定してどうするんだ
そうじゃなくて、クロージャが(悪い?)gotoになる問題が、
(プリミティブな)クロージャをグローバル変数に代入したり、関数からクロージャを返して別のソースコードで利用される場合には発生しなくて、
別のソースコードで定義してあるクラスのオブジェクトのフィールドに代入する場合には発生する理由を聞きたいんだけど
0815デフォルトの名無しさん2013/03/15(金) 00:35:42.74
>>812
え・・・国語も出来ないのに

>メソッドの出力またはフィールドの値がクロージャのクラスを単体テストする場合

メソッドの出力かフィールドの値は自発的に単体テストを施行しちゃうAIらしい
0816デフォルトの名無しさん2013/03/15(金) 00:37:18.73
これ間違った方向に勉強しちゃったこないだのおっさんじゃね?
0817デフォルトの名無しさん2013/03/15(金) 00:40:18.23
おっさん得意の実例出さないで抽象化した言葉を並べる続けることで
反論を跳ね返すオナニー用のマジックミラーやで
実際のところ何もわかってないから相手するだけ無駄
0818デフォルトの名無しさん2013/03/15(金) 00:42:39.94
しかしこんだけ絶妙に意味不明な文章を羅列できるのって才能っちゃ才能だよな
モスバーガーの食い方のアレを思い出すわ
0819デフォルトの名無しさん2013/03/15(金) 00:45:20.03
誰かstaticおじさんを連れてきてくれ
こいつと話し合いができるのは彼しかいない
0820デフォルトの名無しさん2013/03/15(金) 00:46:11.66
>>810
制御を横取りするのはschemeのcall/ccとかでは?
クロージャが制御を横取りする具体例を出してよ
まさかただの高階関数を指して制御を横取りとか言ってないですよね
0821デフォルトの名無しさん2013/03/15(金) 00:59:02.98
母親がホームで自転車で痴漢されたやつみたいになってきたな
0822デフォルトの名無しさん2013/03/15(金) 01:17:00.64
>>798がなかなかシンプルで好きだな
0823デフォルトの名無しさん2013/03/15(金) 01:18:39.77
↑ご本人様
0824デフォルトの名無しさん2013/03/15(金) 01:20:58.56
好きって絶妙な意味不明さがってことだぞw
0825デフォルトの名無しさん2013/03/15(金) 01:29:13.38
>>801
限定継続 とかで調べるといいよ
0826デフォルトの名無しさん2013/03/15(金) 01:33:41.13
>>825
それ呼び出し元に戻ってくるじゃん
goto?
0827デフォルトの名無しさん2013/03/15(金) 01:38:10.55
限定継続って単語出せば煙に巻けると思ったんだろうねw
0828デフォルトの名無しさん2013/03/15(金) 01:51:41.63
限定継続とラムダ計算の関係は意外とまとまった読みものないな。
(読みにくいものはいくらでもあるけどさ。)

http://ja.wikibooks.org/wiki/Scheme/%E7%B6%99%E7%B6%9A%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E5%88%A9%E7%94%A8%E4%BE%8B

自分は同人誌でこの辺読んだだけだけど。
0829デフォルトの名無しさん2013/03/15(金) 03:33:32.04
>>820
○最単純例 (\f -> exitSuccess) (print "hai")
○よくやる悪い例(>>786)
c = (\(f,xs) -> " and " ++ (f xs))
func [x] = x
func (x:xs) = x ++ (c (func, xs))
○推奨される例 ハンドラの例外処理にクロージャを渡す
0830デフォルトの名無しさん2013/03/15(金) 04:43:47.18
「制御を奪う」とかいう話を、よりによってHaskellスレで聞けるなんて、ムネアツだぜ!
0831デフォルトの名無しさん2013/03/15(金) 04:45:39.07
話の腰を折ってすまんが
「OOPとクロージャは相性悪い」
なんて言ってる人は
「FPと高階関数は相性悪い」
と言ってるのにほぼ等しいことを自覚してくれ。
0832デフォルトの名無しさん2013/03/15(金) 04:46:51.79
あと、JavaをOOPLだと思うのはやめてくれ。
あれはOOPLではない。OO用語を使った命令型言語だ。
0833デフォルトの名無しさん2013/03/15(金) 05:58:49.49
>>831
クロージャが元凶だってことだけはわかった。
0834デフォルトの名無しさん2013/03/15(金) 07:01:56.72
元凶はJavaだけでOOP騙っちゃう例のあの人でしょw
0835デフォルトの名無しさん2013/03/15(金) 08:03:31.86
こいつみたいな知ってる専門用語を適当に並び立てるんだけど、全く意味が通ってないやつ居るなー
一般人や初心者にはなんか頭良さそうって思われてるけど、同じ分野の人からは馬鹿にされてるタイプ
0836デフォルトの名無しさん2013/03/15(金) 08:10:50.98
批判は得意な人ばかりのスレですね
少しは建設的なことはいえないのですか?
0837デフォルトの名無しさん2013/03/15(金) 08:15:58.62
プログラム変換について拘るというのなら分かるが、数学的洗練を期待して
このスレに来ている人たちは、OOPもクロージャも関係ない。
「プログラミングHaskell」の巻末索引に登場する程度の概念でさらっと
やって欲しい。
0838デフォルトの名無しさん2013/03/15(金) 08:17:56.92
>>836
直球のブーメランだな
0839デフォルトの名無しさん2013/03/15(金) 08:35:00.29
さすがにクロージャは関係あるんじゃね?
0840デフォルトの名無しさん2013/03/15(金) 11:28:08.92
>>832
>OOPLではない。OO用語を使った命令型言語だ。
もしかしてOOPLと命令型言語が相反する概念だと勘違いしてる?
JavaもC++もRubyも、どれも全部「OOPLであり同時に命令型言語」だぞ
0841デフォルトの名無しさん2013/03/15(金) 12:58:51.77
>>840
メッセージ送信をメソッド呼び出しだと思ってるでしょ?
0842デフォルトの名無しさん2013/03/15(金) 13:13:34.50
ちがうの?
0843デフォルトの名無しさん2013/03/15(金) 15:23:39.18
このスレ何だか難しいね!(´^ω^`)
0844デフォルトの名無しさん2013/03/15(金) 15:37:54.52
一般人から見たら馬鹿かと思えるような会話を難なくこなせるようでないと
自らHaskell使いを名乗ることなど出来んのだよ
0845デフォルトの名無しさん2013/03/15(金) 19:13:30.59
メソッド呼び出しはオブジェクト指向においてメッセージ送信を実現する方法の一つ
0846デフォルトの名無しさん2013/03/15(金) 19:52:31.54
はずれ
0847デフォルトの名無しさん2013/03/15(金) 20:30:33.49
メソッド呼び出しがメッセージ送信を実現すれば、メッセージ送信は正義
いろいろおかしくなったらメソッド呼び出しは悪 (メッセージ送信は悪ではない)
0848デフォルトの名無しさん2013/03/15(金) 21:52:37.55
Haskellは全力で反証不可能を回避する
0849デフォルトの名無しさん2013/03/16(土) 03:39:46.94
>>840-842
メッセージ送信かメソッド呼び出しかは、(構造としての)オブジェクトの粒度と独立性の程度の問題
クラスとメソッドがオブジェクトとして閉じていて、送信元オブジェクトとメッセージとレシーバのオブジェクトが独立していると「表現できるか」がが問題
呼び出し元をオブジェクトとして表現して、関数モジュールを呼び出す際の引数をオブジェクトとは独立して存続していると表現すれば機械語も立派なOOPL

ソースコード上の表現だけで判断するなら真にメッセージパッシングしてるのはerlangだけ

言語仕様だけ見た場合のOOPLと命令型言語の決定的な違いは、メソッドやフィールドの隠匿にこそある
0850デフォルトの名無しさん2013/03/16(土) 06:40:17.89
>>849
> ソースコード上の表現だけで判断するなら真にメッセージパッシングしてるのはerlangだけ

Smalltalkでもメッセージセレクタは識別子ではなく文字列リテラルなんだが?
0851デフォルトの名無しさん2013/03/16(土) 08:35:55.67
SmallTalkはもうおなかいっぱい。
0852デフォルトの名無しさん2013/03/16(土) 09:05:29.79
真に並行動作してるErlangから見れば
Smalltalkのメッセージパッシングなんてゴミ
0853デフォルトの名無しさん2013/03/16(土) 09:14:56.05
OOPとActorモデルの区別ついてますか?
0854デフォルトの名無しさん2013/03/16(土) 09:52:30.15
うんこSmalltalkerがErlangに嫉妬してるの?
0855デフォルトの名無しさん2013/03/16(土) 09:57:44.45
SmalltalkもErlangもよくわかってない人が泥沼にはまってるように見える
0856デフォルトの名無しさん2013/03/16(土) 11:52:01.28
そろそろHaskellの話をだな・・・
0857デフォルトの名無しさん2013/03/16(土) 11:59:17.56
レコード型を定義すると全フィールド名がネームスペースを侵食するの何とかならない?
0858デフォルトの名無しさん2013/03/16(土) 12:04:28.46
だって関数ですから
0859デフォルトの名無しさん2013/03/16(土) 12:06:07.78
やだやだやだっなんとかしてっ
0860デフォルトの名無しさん2013/03/16(土) 12:08:56.23
ネームスペースを侵食する、の意味がよく分からん
0861デフォルトの名無しさん2013/03/16(土) 12:18:03.85
qualified module import
0862デフォルトの名無しさん2013/03/16(土) 12:22:03.07
Haskellのレコード型は諦めろ
0863デフォルトの名無しさん2013/03/16(土) 12:35:18.75
関数takeを作りたいのですが、うまくいきません。
myTake :: Int -> [a] -> [a]
myTake num (x:xs)
| num < 0 = error"Not Valid"
| num == 0 = [] -- Non-Exhastiveになる myTake 0 []
| num == 1 = [x]
| num > 0 = [x] ++ myTake (num -1) (xs)
| otherwise = error"Not Valid"
myTake 2 [] -> Non-Exhastive
0864デフォルトの名無しさん2013/03/16(土) 13:13:57.95
空のリストをx:xsパターンマッチで束縛しようとするとダメなんじゃね?
take _ [] = []
0865デフォルトの名無しさん2013/03/16(土) 13:14:13.91
>>863
myTake 2 [] は myTake num (x:xs) にパターンマッチしていません。

第1引数の 2 は num にパターンマッチしていますが、
第2引数の [] が (x:xs) にパターンターンマッチしていないからです。

マッチするパターンが記述されていないから、Non-Exhastive になります。


Haskell はデフォルトでは、第1引数がパターンマッチすれば、
第2引数以降のパターンマッチ調査は必要になるまでとりあえず棚上する、
という動きはしません。

コンパイルが通るようにするには、
myTake num [] に対する関数定義をちゃんと書く必要があります。
これが一番素直で簡単で根本的な解決です。


ついでながら、先ほどの棚上げ処理をするように明示する方法もあります。
棚上げ処理は正確には反駁不可パターンなどと言い、
棚上げしたいパターンの記述にチルダ文字を前置することで指定します。
myTake num ~(x:xs) = ・・・
ただし、少なくとも今回あなたが書いたプログラムに限れば、
反駁不可パターンをそのまま使うだけではコンパイルが通るというだけで、
根本的な解決にはならない(実行時例外が起きる)ので意味はないですが。
0866デフォルトの名無しさん2013/03/16(土) 13:24:38.95
なんか効率悪いな ↓こうでしょ
| num > 0 = x : myTake (num -1) xs
0867デフォルトの名無しさん2013/03/16(土) 13:29:06.32
これって、フィールド名 x と xs を定義しているけれど名前空間は侵食されてないよね
0868デフォルトの名無しさん2013/03/16(土) 13:31:58.09
出来れば、
nBanme :: [a] -> Int -> a
nBanme [] _ = error"カラ"
nBanme (x:xs) n
| n < 0= error"セロ"
| n == 0 = x
| n > 0 = nBanme (xs) (n-1)
| otherwise = error"ヘン"
のように関数ノ名が何個もあるのではなく

nBanme :: [a] -> Int -> a
nBanme list n
| list == [] || n < 0 = error""
| n == 0 && list == (x:xs) = x
| n > 0 && list == (x:xs) = nBanme (xs) (n-1)
| otherwise = error"Something Wrong"
な感じで関数名が一つなのを定義したいです。
反駁不可パターンなどはもうすこし勉強して理解したいとおもいます。
0869デフォルトの名無しさん2013/03/16(土) 13:41:52.01
case (n, xs) ofを使う
0870デフォルトの名無しさん2013/03/16(土) 14:15:16.07
867は何言ってるんだ
0871デフォルトの名無しさん2013/03/16(土) 14:18:26.87
>>868
そんな変なこだわり持って読みにくいコード書くつもりならPGやめたほうがいいと思う
0872デフォルトの名無しさん2013/03/16(土) 14:25:08.70
case 式で書けるには書けるんだけど、
プログラミングHaskellの最後の章にあるみたいなプログラムの正しさを確認する時とかに、
等式の集まりからなるパターンのほうが扱いやすい、みたいなのがあるので、
一つの式にすることにこだわるのはあまり良くないと思う。
0873デフォルトの名無しさん2013/03/16(土) 14:51:33.52
haskellの並行処理でforkOに対するjoin関数が見当たらないんですが普通どうするんですか?
MVarとか使ってforkIO先で書き換えて同期取るんですかね?
0874デフォルトの名無しさん2013/03/16(土) 14:59:25.48
なぜHaskellはアクターモデルを採用しなかったのか
0875デフォルトの名無しさん2013/03/16(土) 15:32:27.70
>>873
fork した計算の結果が得られるまで待てばいいんだよね。
mergeIO や nmergeIO はなんか使えると思う。

GHC 7.8 でライブラリから取り除かれるから、
代わりに SafeSemaphore パッケージ使えとも書かれているが。
0876デフォルトの名無しさん2013/03/16(土) 18:27:13.33
GHCはパッケージ構成コロコロ変え過ぎだろ
開発で使う場合、実質Haskell = GHCなのに何考えてんだ
0877デフォルトの名無しさん2013/03/16(土) 18:30:20.89
標準化の過程で階層化が遅れてたんからしょうがないじゃない。
2010 標準は、もうそんなには変わらないと思うけど。

標準化されてないものは、そりゃあもうしょうがないでしょ。
0878デフォルトの名無しさん2013/03/16(土) 20:50:47.45
>>875
なるほどありがとう
0879デフォルトの名無しさん2013/03/16(土) 22:11:33.58
{-}
nth' :: [a] -> Int -> [a]
nth' list number = case (list, number) of
([], number < 0)-> error"Invalid Negative"
([], number == 0)-> error"Index Too Large"
((x:xs), number > 0)-> [x] ++ nth' xs (number - 1)
_-> error"Something Wrong"
-}
nBan :: [a] -> Int -> [a]
nBan list number = case (list) of
[] -> case (number) of
number < 0 -> error"dame"
[] -> case (number) of
number == 0 -> error"dame"
(x:xs) -> case (number) of
number > 0 -> [x] ++ nBan xs (number - 1)
_ -> error"Hen"
どっちもなぜか違う。
0880デフォルトの名無しさん2013/03/16(土) 22:15:22.80
MaybeってC#で言うところのint??
0881デフォルトの名無しさん2013/03/16(土) 23:09:13.30
>>880
似たようなものだと考えていいけど、値を使おうとしたときに
中身がnullだった場合の処理を書くことを強制させられるという点が違う。
でもfromJustというチート関数があるので完全じゃない。
検索するとわかるから多少ましかも。
0882デフォルトの名無しさん2013/03/16(土) 23:18:18.70
通りすがりだけど
>>769>>772に一票づつ
HaskellもOOPもまとめて終わりだな
0883デフォルトの名無しさん2013/03/16(土) 23:22:12.34
>>881
別に強制されないと思う

f x = let (Just y) = x in y

とか書けるし
0884デフォルトの名無しさん2013/03/16(土) 23:29:23.73
>>883
それもそうですね
これ警告出せなかったっけ?
0885デフォルトの名無しさん2013/03/17(日) 01:38:55.96
>>882
終わってもいいけど次の言語も半分は今までと同じになるよ
どの辺が同じになるのかも見当がつくから完全に白紙に戻ることはない
0886デフォルトの名無しさん2013/03/17(日) 09:16:17.29
>>885
次の言語、どの辺が同じになるか、
面白いね。もうちょっとしゃべってよ
0887デフォルトの名無しさん2013/03/17(日) 09:29:11.66
Haskell 参照透明性
OOP メッセージパシング
0888デフォルトの名無しさん2013/03/17(日) 09:32:24.21
参照透明性なんてMLやpure LISPの時代から言われていることで
Haskell特有でもなんでもない。

メッセージパッシングはとっくにOOPから捨てられただろ。
今のメジャーなOOPLはみんなメソッドを叩くだけだ。
0889デフォルトの名無しさん2013/03/17(日) 09:39:08.20
ふーんw
0890デフォルトの名無しさん2013/03/17(日) 09:41:48.63
オブジェクト指向のこころもMeyerのオブジェクト指向入門も読まずにOOP語ってる恥ずかしいやつが多いね
0891デフォルトの名無しさん2013/03/17(日) 10:01:57.35
>>890
いいねえ
次は、オブジェクト指向のこころとMeyerのオブジェクト指向入門の
限界についても意見を聴きたいね

>>889
wてなんだ?
0892デフォルトの名無しさん2013/03/17(日) 10:07:18.78
何がしたい
0893デフォルトの名無しさん2013/03/17(日) 10:09:18.32
いいねえw
0894デフォルトの名無しさん2013/03/17(日) 10:15:41.34
何も理解してないやつの「俺は会話についていってますよ」アピール
0895デフォルトの名無しさん2013/03/17(日) 10:42:41.69
>>894
納得
0896デフォルトの名無しさん2013/03/17(日) 10:43:39.58
OOPLはOOが育てた、Haskellは育ててないといって
OOが言語を差別するから、次世代の言語を同じだと思えなくなる
それならOOの本を読まずにOOPLを語る方が良い
0897デフォルトの名無しさん2013/03/17(日) 10:48:45.72
>>896
>OOPLはOOが育てた、Haskellは育ててないといって

ソースplz
0898デフォルトの名無しさん2013/03/17(日) 10:52:24.70
ソースを要求する以前に>>896の意味がわからない
このスレ情緒不安定しぐる
0899デフォルトの名無しさん2013/03/17(日) 10:56:54.31
ちょっと前に暴れてたやつと同じ臭いを感じる
と言うか同一人物かな
0900デフォルトの名無しさん2013/03/17(日) 11:09:27.84
第三次エスパー大戦の始まりか……
0901デフォルトの名無しさん2013/03/17(日) 11:13:33.50
ここはHaskellのスレなのに、Haskellの関係ないOOの話を延々続けてる奴は一体何なの?
0902デフォルトの名無しさん2013/03/17(日) 11:19:55.91
>>900
こんな感じですか
http://www.youtube.com/watch?v=oTKSTf4dr-k
0903デフォルトの名無しさん2013/03/17(日) 11:27:45.29
>>901
等式推論とかやりたいなら
あまり関係ないものでも等価だと主張するぐらいが丁度いいんじゃないの
0904デフォルトの名無しさん2013/03/17(日) 11:37:39.75
OOとHaskellは全く無関係かというとそれもまたアレだし微妙だねえ

型クラス継承はメッセージOOの継承とは別物だけど
メイヤーの表明OOでのサブタイプ多相は成立してるよね
0905デフォルトの名無しさん2013/03/17(日) 13:38:31.31
OOはコーディングする本人の主観的な主義にすぎないから、機械語もOO
0906デフォルトの名無しさん2013/03/17(日) 13:44:53.28
>>905
どこのスレのOO厨にフルボッコされたんだ?
俺がかわりにやっつけてきてやるよ。
0907デフォルトの名無しさん2013/03/17(日) 14:09:24.34
>>905
抽象度と客観度は比例すると思ってる奴がいるんだよ
そういう奴は、抽象的であるOOが主観的なわけがないと思い込む
0908デフォルトの名無しさん2013/03/17(日) 15:01:08.42
>>891
wwwwwwwwwwwwwwww
0909デフォルトの名無しさん2013/03/17(日) 19:47:03.86
>>901
「完全教祖マニュアル」に、トンデモ論を言い続けていれば理論づけてくれる人が現れる、ってのがあるな。
レス数が900を超えています。1000を超えると表示できなくなるよ。