関数型プログラミング ..
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
5383日前に更新/199 KB
担当:undef