関数型プログラミング言語Haskell
at TECH
[前50を表示]
650:デフォルトの名無しさん
03/06/17 20:29
>>649
> 人間にとってはあなたの言う通りあるように見えた方が扱いよいわけだ。
それは関数プログラミングに反するから、関数プログラミング
の立場から見た場合、扱いが良いとは言えないんじゃないですか?
651:デフォルトの名無しさん
03/06/17 20:29
話が逆なんじゃないか?モナドは副作用をわざわざあるように見せるためのものでもないだろう。
652:デフォルトの名無しさん
03/06/19 21:09
a <- hoge
ってやったら、あとは a は見るからに完全に副作用の無い
関数型プログラミングであつかうわけだから、
モナドがあるおかげで関数型の意味がなくなるなんてことは全然無い。
結局モナドって、
副作用や、コードを書いた時点では決まらないものを
普通の関数の引数なんかにつかって破綻するのをさけるために、
型の前にMとかつけてそのままじゃつかえなくする仕組みでしょう。
653:デフォルトの名無しさん
03/06/24 08:16
日本語扱えるhaskellの処理系ってありますか?
654:デフォルトの名無しさん
03/06/24 09:06
いやらしいリンク集作った
URLリンク(homepage3.nifty.com)
655:デフォルトの名無しさん
03/06/26 07:32
Haskellはじめますた。
面白いですね〜
・リストの内包表現に萌えた
・無限データ構造萌え
numForm n = n : numForm (n+1) とか。
あるもんをあるように書いたらいいって言うのがすどい。
詳しい方々、わかんないことがあったら教えてください。
アフォなんですが何とかがんばって基本を理解してから、
モナドを通って詳しい皆さんのところにゆきつきますので。
いまは、組み込み関数?を調べるのに困ってたりします。
IntをDoubleに変換するのってどうするの?
IntとIntegerの変換どうするんでうか?
とか、わからん。
「**」が解らなくて困ってた事も。
(-1)で懲りて、あらゆるところに括弧つけまくりのコードを書いてたり。
656:デフォルトの名無しさん
03/06/27 10:48
>>655
fromIntegral :: forall b a. (Num b, Integral a) => a -> b
toInteger :: forall a. (Integral a) => a -> Integer
fromInteger :: forall a. (Num a) => Integer -> a
657:デフォルトの名無しさん
03/06/27 13:05
今年もICFPの時期が来ましたがみなさんいかがお過ごしですか?
658:デフォルトの名無しさん
03/06/28 13:34
>>655
$をつかうと
f (g (h x))
みたいなのを
f $ g $ h x
とかけて括弧削減。
659:デフォルトの名無しさん
03/06/29 21:21
初心者質問いいですか?
GHCで、API、例えばIsDBCSLeadByte Char -> Bool を使いたいと思ったらどうすればいいのでしょう
660:貧乏脱出!これであなたはお金持ち
03/06/29 21:30
普通に働いてお金持ちになれるのは全体の1%のみって本当!?
本当にお金持ちになるにはやはり「副収入」が必要!
一日30分 おうちでコピペ、コピペ!
嘘だと思うんならランキング見てみてくださいよ↓↓
(直リン不可)
URLリンク(www.adultshoping.com)(直リン不可)
///////.......///////////////////////////
661:デフォルトの名無しさん
03/06/29 22:10
誤解があるようだが、モナドは純粋な関数型言語が
手続き風にコードを書くためのシンタックストリックに過ぎない。
拡張でもなんでもない。
(もちろんシーケンシャルのオプションと使われることが多いわけだが)
662:デフォルトの名無しさん
03/06/29 22:22
_,..............._,.......
,ノ⌒::::::::::::::::::::::::::::::::::::⌒ヽ_
_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヾ、
(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)
_ノ:::::::::::::::;ヘ::::::::::ノ⌒ヽ:::::::::::::::::::::::::::::::::)
(::::::::::::::::::/  ̄ , ‐-、 |::::::::::::::::::::::::::::::::) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(:::::::::::::/ヽj _/ -‐-、 |::::::::::::::::::::::::::::::::) | トリックだ。
):::::::::ヾllli_、_,;iiiillllllllli <::::::;へ:::::::::::::::::( |
(::::::::::::/`i´ ,└=゚'┘ |::::| 6 |:::::::::::::::::::} < 副作用があるように見えているに
`〜、 ゝ| _コ、_、 /|::::| ソ/::::::::::;〜" | 過ぎん。
ヾ|||ll|||||||||||l〉| 三ー'〜〜" |
|||:二三|||| l ,三 ヽ、 \______________
|l ⌒ ||| :// ヽ=、-、_
|l、:( : : ||/ / ヽ, |  ̄\
/  ̄ / ノ / \
663:デフォルトの名無しさん
03/06/29 22:37
サータン,サータン!
664:デフォルトの名無しさん
03/06/30 00:06
ところで、日本語訳のページが見れなくないですか??
665:デフォルトの名無しさん
03/06/30 02:53
>>659わかるひといませんか〜
666:デフォルトの名無しさん
03/06/30 07:59
>>664
URLリンク(www.sampou.org) ならサーバマシンの調子が悪いそうです
667:デフォルトの名無しさん
03/06/30 18:04
>>666
復活したようです。
>>665
いないんじゃないですか。人少なそうだし。
俺は、外界との繋がりはsystem :: String -> IO ExitCodeくらいしか知らない。
668:659=665
03/07/02 07:35
検索の結果、MessageBoxを呼んでいる例は見つけました。(真似たらできました)
でも、*.hiをバイナリ検索しても、IsDBCSLeadByteはインポートされて無いようです。
(CharNextとか、代用できそうなAPIも同様)
これは、Haskellで全角文字を扱うなというお告げでしょうか…
669:デフォルトの名無しさん
03/07/02 08:58
>>668
IsDBCSLeadByteってwindowsのAPI?
そういうものはそのライブラリとリンクしてつかうんじゃないのかな。
haskellに入ってるわけがないというか。
URLリンク(www.haskell.org)
のInterfacing with other Languages and Systemsとか。
670:デフォルトの名無しさん
03/07/02 13:46
>>668
>(真似たらできました)
おー、あなたも私から見たらすどい。
よろしければ、MessageBoxを出すコードをこのスレに張って
共有していただければありがたいです。
671:デフォルトの名無しさん
03/07/02 19:54
>>669
いや、GHC(Win版)には既にWin32 API(の一部)のHaskell用インポートが付いてるんですよ。
>>670
どーせ丸写しなので、いくらでも共有しましょう。
import Win32
main = messageBox nullHANDLE "Text" "Title" mB_OK
たった二行。
コンパイル時に -package win32オプションが必要です。
(win32ディレクトリ以下はデフォルトでは見てくれないので)
↓見つけたページ
URLリンク(www.haskell.org)
なお、同じようにしてMessageBeepを呼ぼうとしましたが、挫折中です。
672:デフォルトの名無しさん
03/07/02 20:21
>>669
あ、でもリンク先のFFIとか使えばできそう?できるのか俺に?
…ありがとうございます
673:デフォルトの名無しさん
03/07/05 01:11
FranTkを使った事のあるかたは居られますか?
使おうとしたけど何だかよくわからんかった。(窓使いです)
674:デフォルトの名無しさん
03/07/06 22:26
>659
URLリンク(www.sampou.org)
>6.1.2 文字と文字列
>文字型 Char は列挙型のひとつで、16 bit の値からなり、Unicode 標準 [10] に準拠する。
Unicodeなので要らないのでは?
ちゃんと実装されているならばだが。
675:デフォルトの名無しさん
03/07/07 10:39
> ちゃんと実装されているならばだが。
内部ではUnicodeかもしれないけど、全角文字をgetCharで読むと二回に分けて来るんですよ…
676:デフォルトの名無しさん
03/07/07 17:07
>>674
Unicodeとその(バイトでの)エンコーディングは別物だ。
677:デフォルトの名無しさん
03/07/08 02:44
>>676
実際
I/O functionsがbyte読んでそれをかえすだけだから、
Charが16ビットである意味がないんだよな。
謎の設計。
678:デフォルトの名無しさん
03/07/14 01:55
return () << [1,2,3] が [1,2,3] を返すのは何で? ()モナドの定義?
679:デフォルトの名無しさん
03/07/14 01:56
ごめん。わかってると思うけど << じゃなくて >> の間違い
680:
03/07/14 03:29
>>678
リストはモナドだから。
681:デフォルトの名無しさん
03/07/14 03:58
そういや、漏れもIOモナドはちょっと分かったつもりだけど、
なんでリストがモナドなのがいまいちよく分からん。
682:デフォルトの名無しさん
03/07/14 04:22
m がモナドのとき return () << m が m になるのはなんで? ()モナドの定義?
683:デフォルトの名無しさん
03/07/14 04:29
また >> を間違えて << にしてまった
書いた後気づいたのだが return [3,4] >> [1,2] も [1,2] 返すのか
() がポイントではなく return の方がポイントだった
かきまぜてスマン
684:デフォルトの名無しさん
03/07/14 04:42
return 1 >> [1,2] でも return 'a' >> [1,2] でも同じだな
685:デフォルトの名無しさん
03/07/14 14:12
>>682
>>の型からわかる型推論。
686:デフォルトの名無しさん
03/07/14 14:13
もっというと()はどのモナドでも返せる。
687:デフォルトの名無しさん
03/07/14 18:52
getChar って結局何返すの?
参照透明性からいって 'a' が入力されたからといって IO 'a' が返るわけじゃないんだよね
たびたび出る話題でスマンが毎回納得にいたらない
688:デフォルトの名無しさん
03/07/14 19:05
IO
689:デフォルトの名無しさん
03/07/14 19:27
>>687
意味不明。IO Charだけど?
690:デフォルトの名無しさん
03/07/14 20:13
>>687
強いて言えば IO 'a'だろうが、それで参照透明性に何の問題が?
691:デフォルトの名無しさん
03/07/14 22:08
そもそもモナドを理解するのにIOモナドから入る,っていうのが間違っている
という気がする.モナドを理解するためには,次の論文を読むのが吉かと.
Wadler, P. : Monads for functional programming
692:デフォルトの名無しさん
03/07/14 22:22
>>691
URLリンク(www.research.avayalabs.com)
ここにあるやつ?
693:デフォルトの名無しさん
03/07/14 23:45
>> 692
そうそう.
694:デフォルトの名無しさん
03/07/15 00:39
関数型では同じ関数なら何回呼んでも同じ値が返る建前では
実は暗黙のworldが渡されていて暗黙の新しいworldも返されている?
695:デフォルトの名無しさん
03/07/15 00:47
モナドって、食べ物じゃなかったのか。
696:デフォルトの名無しさん
03/07/15 01:05
理解するのに論文を読ませる必要がある事自体に
何か問題があるような気もするがー。
697:デフォルトの名無しさん
03/07/15 01:28
今印刷して読んでます…辞書片手に…どなたか、厨房向けに噛み砕いて説明してホスィ
698:デフォルトの名無しさん
03/07/15 01:31
>>697
_,..............._,.......
,ノ⌒::::::::::::::::::::::::::::::::::::⌒ヽ_
_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヾ、
(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)
_ノ:::::::::::::::;ヘ::::::::::ノ⌒ヽ:::::::::::::::::::::::::::::::::)
(::::::::::::::::::/  ̄ , ‐-、 |::::::::::::::::::::::::::::::::) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(:::::::::::::/ヽj _/ -‐-、 |::::::::::::::::::::::::::::::::) | トリックだ。
):::::::::ヾllli_、_,;iiiillllllllli <::::::;へ:::::::::::::::::( |
(::::::::::::/`i´ ,└=゚'┘ |::::| 6 |:::::::::::::::::::} < 副作用があるように見えているに
`〜、 ゝ| _コ、_、 /|::::| ソ/::::::::::;〜" | 過ぎん。
ヾ|||ll|||||||||||l〉| 三ー'〜〜" |
|||:二三|||| l ,三 ヽ、 \______________
|l ⌒ ||| :// ヽ=、-、_
|l、:( : : ||/ / ヽ, |  ̄\
/  ̄ / ノ / \
699:デフォルトの名無しさん
03/07/15 06:43
>>682
return () >> [1,2,3]
後ろがリストなので、これはリストモナド
returnを外して、>> を >>= に変換すると、
[()] >>= (\x -> [1,2,3])
前のリストの要素それぞれに対して後ろの関数を呼んで、その結果を連結したものがこの式の値なので、
(\x -> [1,2,3]) ()
[1,2,3]
700:デフォルトの名無しさん
03/07/15 08:15
>>694
その通り。IO a はHaskellの側から見ると、
data IO a = IO (World -> (a, World))
このような構造になっていて、実行結果がIOだった場合に、表示する前にWorldが渡されて実行される。
実際はそんな面倒なことしていないと思うけどね。
701:デフォルトの名無しさん
03/07/15 08:48
半分ぐらい読みました…まさに>>698のおっしゃる通り…それ以後の式を全部λとして渡して、
でっかい合成関数を組み立てて、最後に一括して実行してるようなイメージでいいのでしょうか?→モナド
(と同時に、実装までそうなってないよなあと信じたい)
702:デフォルトの名無しさん
03/07/15 09:03
>>698
モナドを使えば副作用は「ある」というべきだろう。
たとえばモナドを利用したカウンタを利用して、
あるいは、ファイルに1, 2, ...と書き込んでループをつくれば、
あきらかにそこには副作用があるわけだ。
むしろWorldを変化させながら渡し続けるという発想の転換で(言語に対し)
無いように見せかけているだけだ。人間にとっては副作用は存在する。
703:デフォルトの名無しさん
03/07/15 09:26
>>702
あるように見せかけているだけだろ?
そうじゃなきゃモナドの意味がない
704:山崎 渉
03/07/15 09:34
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
705:デフォルトの名無しさん
03/07/15 11:33
>>701 よいはず。
あと、遅延実行されるのでそう実装しても効率は悪くならないと思う。
706:デフォルトの名無しさん
03/07/15 18:29
>>703
逆だよ。というか循環論法。
そもそも関数型言語には本来副作用は存在し得ない。状態ってものが無いからね。
しかし、特に外部とアクセスするプログラムのためには副作用が必要だ。
関数型言語と、その副作用をともなう処理を、
副作用の種類(IOとか)毎の(内部状態を保持する)モナドを導入することで*分離*してるだけだ。
707:デフォルトの名無しさん
03/07/15 18:34
>>705
701のイメージはあってるが、
> あと、遅延実行されるのでそう実装しても効率は悪くならないと思う。
遅延実行だからこそそういう式の組み立てと式の保存をやらないといけないわけで、
むしろ遅延評価だからと言ってそういう実装をするととんでもないことになる
というべき。
通常の式の評価でも下手に(末尾)再帰すると未評価の式の列が莫大になって
すぐオーバーフローする。
708:701
03/07/15 21:26
大雑把に読みました。後半のパーサは読み飛ばしましたが…
データ型としてのモナドは、要するにC++のクラスtemplate、のようなもの…ですよね?
ということは、IO a -> aな関数が記述不可能なのは、言語の外を相手にしたIOモナドに限った制限で
一般的にはそんな制限は無い、で合ってます?
簡単なサンプルコードどこかにないかな…
709:デフォルトの名無しさん
03/07/15 21:44
>>708
リストから成分を抽出できるでしょ。
710:デフォルトの名無しさん
03/07/16 00:34
>>709
ありがとです。
で、>>681氏と同じ疑問に行き当たるわけですが…
リストが状態を持っているとは思えないのですが、なぜモナド?
(a, b)とか他の一般の構造化型はモナドじゃ無いですよね。
711:デフォルトの名無しさん
03/07/16 01:00
>>710
リストを丸ごと全部で値と思わずに一部だけ更新したいんじゃない?
一部だけ更新するような操作には普通副作用がある。
…違うかな?
712:デフォルトの名無しさん
03/07/16 01:52
リストは >>= と return がモナド演算の法則を 満たしているからモナドなんじゃないかな
(a,b)とか一般の構造型はコンテナの中身の個数が1個ではない定数なのでうまく
モナド演算を定義できないような気がする
リストモナドの中身は任意個数。IOモナドは1個固定。
713:デフォルトの名無しさん
03/07/16 02:29
眠れない…
えーと、要するに、必然性は無いけど、
モナドということにすると [a] >>= (\e -> return (f e)) みたいな便利機能として使えるので
モナドということにしてある、ということですか。
>>711
よく見て無いのですが、ライブラリリファレンスにMutable ArraysとしてIOArrayが書かれてますので、
もしリストモナドで一部の更新が可能なら、こんなもの用意しないと思うので、それは違う気が
(我ながら無茶苦茶な論法だ…)
714:デフォルトの名無しさん
03/07/16 02:51
あれもこれも、Haskellの和書が出ないのが悪い。
715:デフォルトの名無しさん
03/07/16 10:48
>>707
すまんが、そういうふうにする以外の方法が自分には想像できない。
doも普通の再帰なので問題はなさそうだが?
>>711
リストモナド≒内包表記
副作用を発生できるモナドはIOモナドだけです。
>>710
ListとMaybeだけだね。
試しに、(a, b) でMonadを作ってみたが…きつい。
---
instance Monad ((,) a) where
(>>=) (sub, main) f = (sub, main') where
(sub', main') = f main
return main = (bottom, main)
bottom = bottom
test = do x <- (("a", 2), 1)
y <- return $ x+1
return $ y*2
---
*Main> test
(("a",2),4)
716:デフォルトの名無しさん
03/07/16 12:02
だれとはなくに
「型構築子」IO はモナドだけど IO a はモナドじゃないよ。
「型構築子」[] はモナドだけど [a] はモナドじゃないよ。
717:デフォルトの名無しさん
03/07/16 12:17
>>713
haskellのリストやアレイはは一部を変更すると全部コピー。
というのは、そのデータ(リスト等)が他の場所で使われるかもしれないから。
一部を変更したということがそのデータを使うプログラムの他の部分にも
わからないといけない。
そのためには、使う部分全部をそのデータの内部状態をあらわすモナドでくるんで
おく必要がある。
# 変更し終わったら、それはモナドの外に出してもいい。
>>715
701の件については、誤読していた。それ以降の式、ってのが何を指すのかわからない。
それはともかくとして、
(IO/状態)モナド内の計算の実行は、手続き型と同様にできるとおもうけど。
> 副作用を発生できるモナドはIOモナドだけです。
haskellプログラムがわからみればIOも他のモナドもかわらない。
プログラマから見たときも結局は同じこと。謎の内部状態をもつ
モナドを受渡しながら処理を順次実行するわけだから。
内部で定義されたモナドでもそのモナドの性質をみとおさなければ、
副作用と同様でしょう。
718:デフォルトの名無しさん
03/07/16 12:30
別のいいかたをすれば、711が書いているように、普通一部を変更すると
副作用が出るわけで、関数型言語では一般にはそれができない。
だが、その副作用/状態を追跡するモナド(STArray,IOArray等)を引数と
して渡し続けながらの順次計算であれば一部変更もできるわけだ。
719:デフォルトの名無しさん
03/07/16 12:45
だれとはなくに
「データ構築子」はファーストクラスだけど
「型構築子」はファーストクラスじゃないよ。
720:デフォルトの名無しさん
03/07/16 13:13
だれとはなくに
モナドは「型構築子」の性質であって、データの性質じゃないよ。
721:デフォルトの名無しさん
03/07/16 15:29
>>717
まず、すまんかった。
確かに中身を見なければ副作用を起こすことは可能だ。そちらの言う通り。
以降の式だが、自分は a >>= (\x -> b) の式に出てくるλのことだと思っている。
そして、715のそういうふうにとは、どでかい合成関数を作ってからそれを実行するということ。
もちろん、遅延実行されるので、少し作ってはそれを実行してというふうになると思っているが。
>(IO/状態)モナド内の計算の実行は、手続き型と同様にできるとおもうけど。
main = sequence_ $ reverse $ [putStr "\n", putStr "a", putStr "b"]
こう言うのはどうする…?
…特殊すぎるか。他は最適化されててもおかしくないやね。
>>718
少なくともIOArrayはIOモナドの一部であってモナドそのものではないと思うが。
>>719
しかし少なくともカリー化はされている。
722:デフォルトの名無しさん
03/07/16 16:39
>>715
サンプルとして活用させていただきます
で、勝手にインデント。
module Main where
instance Monad ((,) a) where
(>>=) (sub, main) f = (sub, main') where
(sub', main') = f main
return main = (bottom, main)
bottom = bottom
test = do
x <- (("a", 2), 1)
y <- return $ x+1
return $ y*2
>>721
表現が悪くて申し訳ないです。そのつもりでした。do A; B… と書いた時のB以降です。
723:デフォルトの名無しさん
03/07/16 17:37
data Id a = Id a deriving Show
instance Monad Id where
Id x >>= f = f x
return = Id
foo :: Int -> Id Int
foo arg =
do { x <- ID arg
; x <- ID (x * 2)
; x <- ID (x + 1)
; return x }
というHaskell のプログラムと、
int
foo (int arg)
{
int x;
x = arg;
x = x * 2;
x = x + 1;
return x;
}
は、そっくり。上は副作用をつかってないですけど、
下は副作用をつかっています。
そんだけ。
int
724:デフォルトの名無しさん
03/07/16 18:28
>>723
ID じゃなくて Id
725:デフォルトの名無しさん
03/07/16 20:17
突然ながら、FFIを試してみたり…
#include "hsFFI.h"
#include <stdio.h>
void __stdcall print_hex(HsInt a)
{
printf("%x", a);
}
foreign import stdcall "print_hex" printHex :: Int -> IO ()
main :: IO ()
main = do printHex 1234
>ghc ffi.hs ffi_c.hc -fglasgow-exts
Warning: retaining unknown function `_print_hex@4' in output from C compiler
動くんですけど、このWarningが消せない…
726:デフォルトの名無しさん
03/07/16 22:59
>>720
> 以降の式だが、自分は a >>= (\x -> b) の式に出てくるλのことだと思っている。
> そして、715のそういうふうにとは、どでかい合成関数を作ってからそれを実行するということ。
よくわからない。ダイナミックに関数を作ると?
> ...
> main = sequence_ $ reverse $ [putStr "\n", putStr "a", putStr "b"]
関数ポインタの配列をつくっておいて並べ替えるのかな。
>>721
> 少なくともIOArrayはIOモナドの一部であってモナドそのものではないと思うが。
確かに、モナドはそれぞれIOとSTだ。
モナドの一部っていうのもよくわからないが…
monad-awareという感じか。
727:デフォルトの名無しさん
03/07/16 23:31
>>725
__stdcall -> ccall、ffi_c.hc->ffi_c.c
で
ghc -ffi ffi.hs ffi_c.c
とすると何のWarningもなくコンパイルを通った(Windowsではない)。
728:デフォルトの名無しさん
03/07/17 01:25
誰か Haskell の和書書いてくれよ。
5000円くらいまでなら買うからさ。
和書ないとやる気が出ねぇし、普及なんて夢のまた夢だよ。
729:デフォルトの名無しさん
03/07/17 02:06
Haskellはドイツ語でクシャミの事
730:デフォルトの名無しさん
03/07/17 04:00
>>727
拡張子を変えたら警告が出なくなりました。
よくよく見てみれば.hcってコンパイラが生成したCソース用の拡張子…
どうも、お騒がせしました。
731:デフォルトの名無しさん
03/07/19 19:40
>>729
くしゃみが出るくらいに香辛料の効いたカレーを“Haskell Curry”と云う!?
732:デフォルトの名無しさん
03/07/19 22:54
>>726
>よくわからない。ダイナミックに関数を作ると?
その通り。 (.) が関数を合成するのと同じように。
>関数ポインタの配列をつくっておいて並べ替えるのかな。
引数等を保存しておく必要があるので、それをすると、λと変わらないと思う。
>>722
無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。
ついでに、前に作ったモナドをどうぞ。
面倒を少し減らす程度のものですが。
---
module Main where
--type ReadS a = String -> [(a,String)]
newtype ReadR v = ReadR { runr :: ReadS v}
instance Monad ReadR where
ReadR r >>= fr = ReadR (\str -> [ret| (v,str') <- r str, ret <- fr v `runr` str'])
return v = ReadR (\str -> [(v, str)])
rread :: (Read a) => ReadR a
rread = ReadR reads
rlex :: ReadR String
rlex = ReadR lex
test :: String -> (Int,String)
test str = head test' where
test' = do rread
`runr` str
---
Main> test "125 "
(125," ")
733:デフォルトの名無しさん
03/07/21 01:46
Randomを使ったコードを少し書いて見ました。
毎回の let (r2, g2) = random g1 in … 数字は使うたびに増やす…が面倒だったので、
モナドにすれば好きな時に r2 <- nextRandom とか書けるのかなあ、とか思ったり。
(既にあるのかもしれませんが)
>>732
うう、ありがとうございます。しかし、私のレベルでは何をやっているのかと用途の両方がわかりません…。
734:デフォルトの名無しさん
03/07/21 01:52
>>732
|無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。
モナドの法則を満たさなくてモナドといえるの?
735:デフォルトの名無しさん
03/07/21 02:33
module RandomProgression where
import Random
data RandomProgression r a = RP (r -> (a, r))
nextRandom :: (RandomGen r, Random a) => RandomProgression r a
nextRandom = RP (\r -> random r)
instance Monad RandomProgression r a where
--(>>=) :: RandomProgression r a -> (a -> RandomProgression r b) -> RandomProgression r b
RP x >>= f =
RP (\r ->
let (a, r') = x r in
let RP b = f a in
b r')
--return :: a -> RandomProgression r a
return value = RP (\r -> (value, r))
書いてみました…instanceでエラーが出ます…わかりません…
↓こんな風に使えたらいいなと思ってる
let (answer, g) = (do a <- nextRandom; return (a `mod` 10)) (mkStdGen 100)
736:デフォルトの名無しさん
03/07/21 02:45
括弧が要るんですね…
instance Monad (RandomProgression r) where
実行用に
eval :: (RandomGen r) => RandomProgression r a -> r -> (a, r)
eval (RP e) r = e r
書き足して
RandomProgression> eval((do x <- nextRandom; return (x `mod` 10)) :: RandomProgression StdGen Int) (mkStdGen 10)
(7,432453652 1655838864)
動いたー!
どうも、スレ汚しごめんなさい
737:デフォルトの名無しさん
03/07/21 02:59
>>733-736
そんなことをする必要はない。
randoms (mkStdGen 1) ::[Int]
のようにして無限乱数列が作れるのだから。
Make use of the power of lazy evaluation !
# あとはそれにmapでもなんでもして加工すればいい。
738:デフォルトの名無しさん
03/07/21 15:25
ハクションと似てなくもないような
739:デフォルトの名無しさん
03/07/21 19:05
>>737
なるほど!遅延評価を忘れてました。
しかしそれでも2個の乱数を取ってきたい時は、let (r1:r2:rs') = rs (以降はrs'から取る) みたく
乱数列を意識して渡していかないといけないような。いや、ずっと書きやすいではありますが。
740:デフォルトの名無しさん
03/07/21 20:22
>>734
知らん。気になるのなら、たとえば、こうすればちゃんとモナドになる。
module Main where
instance (Num a) => Monad ((,) a) where
(>>=) (sub, main) f = (sub+sub', main') where
(sub', main') = f main
return main = (0, main)
>>733
まずちょっと修正...スマソ。
import Monad -- 追加
instance Monad ReadR where
ReadR r >>= fr = ReadR (\str -> [ret| (v,str') <- r str, ret <- fr v `runr` str'])
return v = ReadR (\str -> [(v, str)])
fail s = mzero -- 以下追加
instance MonadPlus ReadR where
mzero = ReadR (\s -> [])
mplus (ReadR f) (ReadR g) = ReadR (\s -> f s ++ g s)
用途としては、下のようなコード(やさしいHaskell 8.3節からコピペ)のtuvwxのような変数を書かなくてもよくすること。それだけです。
>readsTree :: (Read a) => ReadS (Tree a)
>readsTree s = [(Branch l r, x) | ("<", t) <- lex s,
> (l, u) <- readsTree t,
> ("|", v) <- lex u,
> (r, w) <- readsTree v,
> (">", x) <- lex w]
> ++
> [(Leaf x, t) | (x, t) <- reads s]
741:デフォルトの名無しさん
03/07/21 20:26
上のコードのReadR版
>rreadTree :: (Read a) => ReadR (Tree a)
>readsTree s = rreadTree `runr` s
>rreadTree = do "[" <- rlex
> l <- rreadTree
> "|" <- rlex
> r <- rreadTree
> "]" <- rlex
> return $ Branch l r
> `mplus`
> do x <- rread
> return $ Leaf x
742:デフォルトの名無しさん
03/07/21 20:38
>>739
なんかまだ手続き型の頭のような気がする:)
関数型だったら結局繰り返しは再帰で書くんだから、
結局こんな感じになると思う。
f 0 result rs = result
f n result (r1:r2:rs) = f (n - 1) (g r1 r2 result) rs
# f 10 [] randomlist のように使う。
# g で欲しいものを計算。
743:デフォルトの名無しさん
03/07/21 20:39
う、結局が二つも。
744:デフォルトの名無しさん
03/07/22 01:26
>> 740
Num a が気になる
745:デフォルトの名無しさん
03/07/23 22:09
GHCって実はfromIntが無かったりします…?
Variable not in scopeと言われるのですが
746:デフォルトの名無しさん
03/07/24 01:42
>744
気にするな。
747:デフォルトの名無しさん
03/07/24 10:52
>>745
fromInteger じゃだめなの?
今のHaskell 98 の Prelude には fromInt は無いのでは。
748:デフォルトの名無しさん
03/07/24 20:52
>>747
いえ、Intからの変換にfromInteger (toInteger n)と書くのが冗長な気がしただけです。
749:デフォルトの名無しさん
03/07/29 00:04
>>748
Enum クラスのメソッドが使えるのでわ。
toEnum :: Int -> a
fromEnum :: a -> Int
750:デフォルトの名無しさん
03/08/01 10:11
>>749
FloatやDouble…のつもりでしたが、それらもtoEnumでいけるのですね。
ありがとうございます。そして遅レスごめんなさい
751:デフォルトの名無しさん
03/08/02 01:34
ニセ手続き型?の基本的なもなどはなんとなくわかった(というか「同じやん」ということで)
けど、それ以外のモナドがワカンネ。
ライブラリ読んでみたりしたけど激むず。
モナド難しいですね。
ニセ手続き型を理解したあとは、どうしたらよいのでしょうか
752:デフォルトの名無しさん
03/08/02 19:05
GHCのText.Regexで
matchRegex (mkRegex "abc") "xabcx"
=> Just []
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("x","abc","x",[])
これってバグ?
753:デフォルトの名無しさん
03/08/02 19:42
あ、二つ目は書き間違い。
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("","abc","x",[])
754:デフォルトの名無しさん
03/08/02 19:54
モナドの問題点とかは特に上がってないのですか?
実行効率周りとか。
755:デフォルトの名無しさん
03/08/08 01:02
GHC 6.0.1 Released
756:デフォルトの名無しさん
03/08/08 07:07
>>755
いただきました
757:デフォルトの名無しさん
03/08/11 13:30
素朴な疑問なのですが Haskell の言語使用はかなり頻繁に変わるものなのでしょうか?
2000年あたりに出版された本で勉強しようかと思っているのですが、それいらい大きく変わったとか、
近いうちに大きく変わるとか、ありますか?
758:デフォルトの名無しさん
03/08/12 00:36
基本はHaskell98から変わってないんじゃないだろうか。
処理系によっては独自拡張があることも。
759:デフォルトの名無しさん
03/08/12 21:05
>>758
サンクスコ。
言語仕様は大きく変わってないから、そのころの本で勉強しても問題ないということですね。
がんばって勉強してみます。
(関数型言語は使ったことがないから、なじめるかわからないけど)
760:デフォルトの名無しさん
03/08/13 20:49
確かに言語仕様はほとんど変わっていないが、
ライブラリがかなり違うような気がする。
ライブラリは階層化ライブラリ(Data.Listとか)
で決まりでいいのだろうか。
標準ライブラリ以外になると混沌としか言い様がない
761:デフォルトの名無しさん
03/08/13 21:45
Hugsもライブラリを2通り持ってるね。
762:デフォルトの名無しさん
03/08/13 22:52
URLリンク(www.haskell.org)
ここにあるのが標準ライブラリーで、足りない部分は、
URLリンク(www.haskell.org)
から探すとか、自作するということですか?
URLリンク(www.haskell.org)
で、これが HUGS についてくるライブラリー群?
763:デフォルトの名無しさん
03/08/14 00:53
Hugsのライブラリについて書いてあるよ。
URLリンク(cvs.haskell.org)
GHCは5.04.1=>6.0でライブラリ関係が少し変わっているような気がする。
764:デフォルトの名無しさん
03/08/15 02:04
前スレは約一年に使い切ったのに、part2 に移行して少し停滞してます。
765:デフォルトの名無しさん
03/08/15 02:29
URLリンク(www.cse.ogi.edu)〜hook/cse532f99/haskell1.htm
↑赤黒木の実装に感動。
だれか、コンパクトなdelete実装しれ!
766:山崎 渉
03/08/15 16:09
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
767:デフォルトの名無しさん
03/08/19 11:49
6.0.1入れたらwxHaskellが使えなくなっちまった
768:デフォルトの名無しさん
03/08/19 15:54
win de GUI no hito mada-?
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5330日前に更新/199 KB
担当:undef