[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 16:29 / Filesize : 199 KB / Number-of Response : 769
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:潜伏していた1 mailto:sage [02/02/16 16:55]
何とか生き残れました。
前スレ
pc.2ch.net/test/read.cgi/tech/996131288/l50

関連 >>2 以降

729 名前:デフォルトの名無しさん [03/07/17 02:06]
Haskellはドイツ語でクシャミの事

730 名前:デフォルトの名無しさん mailto:sage [03/07/17 04:00]
>>727
拡張子を変えたら警告が出なくなりました。
よくよく見てみれば.hcってコンパイラが生成したCソース用の拡張子…
どうも、お騒がせしました。

731 名前:デフォルトの名無しさん mailto:sage [03/07/19 19:40]
>>729
くしゃみが出るくらいに香辛料の効いたカレーを“Haskell Curry”と云う!?

732 名前:デフォルトの名無しさん mailto:sage=721 [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 名前:デフォルトの名無しさん mailto:sage [03/07/21 01:46]
Randomを使ったコードを少し書いて見ました。
毎回の let (r2, g2) = random g1 in … 数字は使うたびに増やす…が面倒だったので、
モナドにすれば好きな時に r2 <- nextRandom とか書けるのかなあ、とか思ったり。
(既にあるのかもしれませんが)

>>732
うう、ありがとうございます。しかし、私のレベルでは何をやっているのかと用途の両方がわかりません…。

734 名前:デフォルトの名無しさん mailto:sage [03/07/21 01:52]
>>732
|無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。
モナドの法則を満たさなくてモナドといえるの?

735 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/07/21 02:59]
>>733-736
そんなことをする必要はない。

randoms (mkStdGen 1) ::[Int]

のようにして無限乱数列が作れるのだから。
Make use of the power of lazy evaluation !

# あとはそれにmapでもなんでもして加工すればいい。



738 名前:デフォルトの名無しさん mailto:sage [03/07/21 15:25]
ハクションと似てなくもないような

739 名前:デフォルトの名無しさん mailto:sage [03/07/21 19:05]
>>737
なるほど!遅延評価を忘れてました。
しかしそれでも2個の乱数を取ってきたい時は、let (r1:r2:rs') = rs (以降はrs'から取る) みたく
乱数列を意識して渡していかないといけないような。いや、ずっと書きやすいではありますが。

740 名前:デフォルトの名無しさん mailto:sage=732 [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 名前:デフォルトの名無しさん mailto:sage=740 [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/07/21 20:39]
う、結局が二つも。

744 名前:デフォルトの名無しさん mailto:sage [03/07/22 01:26]
>> 740
Num a が気になる

745 名前:デフォルトの名無しさん mailto:sage [03/07/23 22:09]
GHCって実はfromIntが無かったりします…?
Variable not in scopeと言われるのですが

746 名前:デフォルトの名無しさん mailto:sage=740 [03/07/24 01:42]
>744
気にするな。

747 名前:デフォルトの名無しさん [03/07/24 10:52]
>>745
fromInteger じゃだめなの?
今のHaskell 98 の Prelude には fromInt は無いのでは。



748 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/08/01 10:11]
>>749
FloatやDouble…のつもりでしたが、それらもtoEnumでいけるのですね。
ありがとうございます。そして遅レスごめんなさい

751 名前:デフォルトの名無しさん [03/08/02 01:34]
ニセ手続き型?の基本的なもなどはなんとなくわかった(というか「同じやん」ということで)
けど、それ以外のモナドがワカンネ。
ライブラリ読んでみたりしたけど激むず。

モナド難しいですね。

ニセ手続き型を理解したあとは、どうしたらよいのでしょうか


752 名前:デフォルトの名無しさん mailto:sage [03/08/02 19:05]
GHCのText.Regexで
matchRegex (mkRegex "abc") "xabcx"
=> Just []
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("x","abc","x",[])
これってバグ?

753 名前:デフォルトの名無しさん mailto:sage [03/08/02 19:42]
あ、二つ目は書き間違い。
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("","abc","x",[])


754 名前:デフォルトの名無しさん mailto:sage [03/08/02 19:54]
モナドの問題点とかは特に上がってないのですか?
実行効率周りとか。

755 名前:デフォルトの名無しさん mailto:sage [03/08/08 01:02]
GHC 6.0.1 Released

756 名前:デフォルトの名無しさん mailto:sage [03/08/08 07:07]
>>755
いただきました

757 名前:デフォルトの名無しさん mailto:sage [03/08/11 13:30]
素朴な疑問なのですが Haskell の言語使用はかなり頻繁に変わるものなのでしょうか?
2000年あたりに出版された本で勉強しようかと思っているのですが、それいらい大きく変わったとか、
近いうちに大きく変わるとか、ありますか?



758 名前:デフォルトの名無しさん mailto:sage [03/08/12 00:36]
基本はHaskell98から変わってないんじゃないだろうか。
処理系によっては独自拡張があることも。

759 名前:デフォルトの名無しさん mailto:sage [03/08/12 21:05]
>>758
サンクスコ。
言語仕様は大きく変わってないから、そのころの本で勉強しても問題ないということですね。
がんばって勉強してみます。
(関数型言語は使ったことがないから、なじめるかわからないけど)

760 名前:デフォルトの名無しさん mailto:sage [03/08/13 20:49]
確かに言語仕様はほとんど変わっていないが、
ライブラリがかなり違うような気がする。
ライブラリは階層化ライブラリ(Data.Listとか)
で決まりでいいのだろうか。

標準ライブラリ以外になると混沌としか言い様がない

761 名前:デフォルトの名無しさん mailto:sage [03/08/13 21:45]
Hugsもライブラリを2通り持ってるね。

762 名前:デフォルトの名無しさん mailto:sage [03/08/13 22:52]
www.haskell.org/onlinelibrary/
ここにあるのが標準ライブラリーで、足りない部分は、
www.haskell.org/libraries/
から探すとか、自作するということですか?

www.haskell.org/ghc/docs/latest/html/libraries.html
で、これが HUGS についてくるライブラリー群?

763 名前:デフォルトの名無しさん mailto:sage [03/08/14 00:53]
Hugsのライブラリについて書いてあるよ。
cvs.haskell.org/Hugs/pages/hugsman/libs.html
GHCは5.04.1=>6.0でライブラリ関係が少し変わっているような気がする。

764 名前:デフォルトの名無しさん mailto:sage [03/08/15 02:04]
前スレは約一年に使い切ったのに、part2 に移行して少し停滞してます。

765 名前:デフォルトの名無しさん mailto:sage [03/08/15 02:29]
www.cse.ogi.edu/〜hook/cse532f99/haskell1.htm
↑赤黒木の実装に感動。
だれか、コンパクトなdelete実装しれ!

766 名前:山崎 渉 mailto:(^^) [03/08/15 16:09]
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

767 名前:デフォルトの名無しさん [03/08/19 11:49]
6.0.1入れたらwxHaskellが使えなくなっちまった



768 名前:デフォルトの名無しさん mailto:age [03/08/19 15:54]
win de GUI no hito mada-?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef