関数型プログラミング言語Haskell Part3at TECH
関数型プログラミング言語Haskell Part3 - 暇つぶし2ch237:207
04/10/14 19:27:09
>>232 自己レスもちろん>>207もだめです。
モナドは雰囲気はモノイドなんですがやっぱりモノイドとは
みなせそうにないので、これも嘘です。
> この半群の集合への作用(注1)の仕方を定めたものがMonadです。
予想と違って、正しいかもしれないものだと素直に読んだ方が
多かったようで、申し訳ないです。

238:デフォルトの名無しさん
04/10/14 19:31:13
理解した部分だけ書くと、結合法則を満たす関数の合成を使うと
IOのような実行の順序が重要な意味をもつ関数を(順序不定で)合成しても
合成された関数は一意的な順序でIOが実行される関数になるということか?

順序を保つ合成が結合法則を満たすのは分かったが、
結合法則を満たす合成は全て実行の順序を保つでいいのか?

239:デフォルトの名無しさん
04/10/14 21:14:39
>>238
順序不定には合成できないから、明示的に順序をつけることを強制できる。

putStr (getLine, [getChar])
でなく
getLine >>= (\s -> getChar >>= (\c -> putStr (s, [c])))

getChar >>= (\c -> getLine >>= (\s -> putStr (s, [c])))

240:デフォルトの名無しさん
04/10/14 21:26:54
じゃあモナドは実行の順序が決められてる関数の中の一つってことか?

241:デフォルトの名無しさん
04/10/14 21:57:19
例えば左から右へ順番に実行する関数hogeが定義できて、
hoge getLine getCharから
getLine >>= (\s -> getChar >>= (\c -> putStr (s, [c])))と
同じ動作を定義できるのか?

242:デフォルトの名無しさん
04/10/15 01:54:14
>結合法則を満たす合成は全て実行の順序を保つでいいのか?

これは成り立たないと思う。

モナドの結合法則の概念と順序は本来関係ないんじゃないかな。
たまたま順序を組み立てるのにモナドが使えるってだけだと思う。

URLリンク(www.sampou.org)
↑のListモナドとかは
順序とは関係なさそうだし。(関数から複数の遅延込みの非正格値を返すためのもの?)
モナドの用途は順序の決定のみにあらずってとこか。

243:デフォルトの名無しさん
04/10/15 04:12:02
>>241
hoge :: IO String -> IO Char -> IO ()
hoge f g = f >>= \s -> g >>= \c -> putStr (s, [c])

getLine :: String、getChar :: Char だったら無理。

244:デフォルトの名無しさん
04/10/15 04:13:08
>>242
> List モナドは非決定性をもつ計算の連鎖を、演算をそれぞれのステップで可能なすべての値に適用することで、合成する戦略を内包しています。
だけなら、モナドでなくてもいいね。
------------
module MList where

data MList a = a :*: (MList a) | MNull deriving (Eq, Show)
infixr 3 :*:


instance {- Broken -} Monad MList where
  (x :*: xs) >>= f = merge (f x) (xs >>= f)
    where 
      merge (x :*: xs) ys = x :*: merge ys xs
      merge MNull ys = ys
  MNull >>= f = MNull
  return x = x :*: MNull
  fail s = MNull

toMList xs = foldr (:*:) MNull xs

(>=>) = (>>=) -- 2ch : ">> が多すぎます!"
(>=>) :: Monad m => m a -> (a -> m b) -> m b
test f = test1 f == test2 f
test1 f = f [1,2] >=> \x -> f [3, 4] >=> \y -> f [5, 6]
test2 f = (f [1,2] >=> \x -> f [3, 4]) >=> \y -> f [5, 6]

245:デフォルトの名無しさん
04/10/15 08:50:04
そうだよなあ。
モナドが「暗黙の引数world」と「関数のeagerな評価」を意味するだけなら,結合法則はなくてもよい。

246:デフォルトの名無しさん
04/10/15 11:05:46
IOモナドについて。
話の流れから多少それるのかもしれませんが、
IOモナドの僕のとらえかたは以下のような感じです。

putStrはStringを引数としてとり、
「その文字列を表示する動作」を返す関数。
であり、putStr "Hello " >> putStr "World"
とした場合、putStr "Hello "とputStr "World"のそれぞれが評価される
順番は問題ではない。
putStr "Hello "が評価された時点では、
"Hello "は出力されずに、「"Hello "を出力する動作」が
決定するだけである。
そして、putStr "Hello " >> putStr "World"は、
"Hello "を出力した後に"World"を出力する動作として評価される。
この時点では何の出力も生じない。
この動作は、main = ...というように、mainに代入されることにより、
評価器とは切り離された装置によって出力に変えられる。

つまり、putStr "Hello " >> (putStr "World" >> putStr "\n")
とした場合、putStr "World >> putStr "\n"の部分が先に評価されて、
「"World"を出力した後に、"\n"を出力する動作」となり、
その後に、putStr "Hello "と結び付けられて、
「"Hello "を出力した後に「"World"を出力した後に"\n"を出力」する動作」
となる。
これは、
「「"Hello "を出力した後に"World"を出力」した後に"\n"を出力する動作」
と等しい。

247:デフォルトの名無しさん
04/10/15 12:01:44
>>246
ありがとう、やっとすっきりした。
つまり継続を渡しているわけね。


248:デフォルトの名無しさん
04/10/15 12:14:00
>>246
> であり、putStr "Hello " >> putStr "World"
> とした場合、putStr "Hello "とputStr "World"のそれぞれが評価される
> 順番は問題ではない。

順番は問題。これは左から評価しないと(されるように>>が定義されてないと)、
putStr "Hello ">> error "Error." 等が正しくうごかない。

> この動作は、main = ...というように、mainに代入されることにより、
> 評価器とは切り離された装置によって出力に変えられる。

上とも関連して、出力しながら内部の式を評価するわけで、
評価し終わったものを実行するのでは「ない」のだから、
 main world を評価すると考えるほうがいいのでは。

上で自分でもただStateモナドのようにかいてしまったけれど、
IO a = World -> (a, World) {- ただしStrict -} と思うことにして。 

(正則性と関連して実はIOはモナドの結合法則を満たしていなかったような)


> つまり、putStr "Hello " >> (putStr "World" >> putStr "\n")
> とした場合、putStr "World >> putStr "\n"の部分が先に評価されて、

ここも左から評価される。

あとは大体OKと思う。

249:デフォルトの名無しさん
04/10/15 17:24:40
>>248
>順番は問題。
>>256
> putStrはStringを引数としてとり、
>「その文字列を表示する動作」を返す関数。
という前提だからいいんじゃないの?


250:デフォルトの名無しさん
04/10/15 18:08:50
>>249
putStr "Hello " >> error "Error." 
の右辺を先に評価したら"Hello"が表示される前にerrorで終わってしまうでしょ。

正格性解析かなにかで>>の左辺と右辺が
Strictにしかも_|_にならずに評価できると知っていたら
何かの気まぐれで右辺から評価するかもしれないけど、基本は左から。

ちなみに右から(Lazyに)評価したら末尾再帰も無意味になるし無限ループも書けない。

251:デフォルトの名無しさん
04/10/15 20:36:06
ちなみに右から(Lazyに)評価したら末尾再帰も無意味になるし無限ループも書けない。
どういう意味だ?

252:246
04/10/15 21:53:07
評価という言葉を誤用したみたいです。

putStr "Hello " >> putStr "World"は、
"Hello "を出力する動作の後に、"World"を出力する動作を続けた動作と解釈される。
と言いかえるべきなのかな。

(1+3) : []を、(4ではなく)1+3を空のリストに加えたものと解釈される。
というのと同じで、この1+3が4になるのはmainに関連づけられたとき
(とhugsなどで、返り値の表示を求められたとき)のみである。

つまり、putStr "Hello " >> putStr "World"が左から評価されるのは、
print ((1+2):(2+3):[])が左から評価されるのと同様、
値が必要になった時点で評価されるという、遅延評価の性質から理解できる。

print ((1+2):(2+3):[])でまず1+2が、つぎに2+3が評価されるのは、
(:)に左から順に評価するという性質があるのではなく、
必要とされるのが1+2のほうが先であるというためである。
これは、print $ reverse ((1+2):error "foo":(2+3):[])の出力が[5,となる点からも確認できる。

それと同様にputStr "Hello " >> putStr "World"が左から評価されるのは、
まずputStr "Hello "がプログラムの実行に必要とされ、その後にputStr "World"が必要とされるためであり、
(>>)が左から評価されるといった性質を持っている必要はない。

(しかし、(>>)の右側が左側よりも先に必要とされるという状況は考えられないので(>>)が左から評価される性質を持つというのは
そんなに間違いではないかもしれない。)

putStr "Hello " >> error "Error."がうまく評価されるのも同様で、
"Hello "の出力の際にはerror "Error."を評価する必要がないためである。

現時点での僕の解釈ですので、間違いもあると思います。
Haskellに積まれた概念は非常に興味深いので、
今後も熟考していこうと思っています。

253:デフォルトの名無しさん
04/10/15 23:06:59
どうも隔靴掻痒の感があるな。
モナドの表示的意味は言語仕様に書いてないのか?

[| >> |]ρσ = ...?

254:デフォルトの名無しさん
04/10/16 05:09:35
>>252
いったいどういう原理によって
> まずputStr "Hello "がプログラムの実行に必要とされ、その後にputStr "World"が必要とされるためであり、
こうなってると思ってるわけですか? 

mainや(>>)は関数じゃなくてなにかすごく賢い"評価器とは切り離された装置"
が何が必要かを見切って必要なところだけ評価するという立場?
それならそれでもいいですが…

私は、State(World)についてStrictなMonadだと思えば、
なぜ(>>)の左が先に必要になったのかが、説明できると書いたわけです。

255:デフォルトの名無しさん
04/10/16 05:13:41
>>251
まず、mainだけ特殊な評価をうけるとは考えないことにします。

右から評価されると無限ループも書けないというのは、
main = loop where   loop =  act >> loop
                    act = print "x"
ここでloopの右辺を先に評価したらact >> (act >> (act >> ..))と
ネストした列ができるだけでloopの処理が進まないという意味です。
末尾再帰も同様のことになります。

先に述べたように、特殊な評価装置や特殊ルールは考えないので、これは、
(>>)がそういう順序に評価を導くように定義されているということを意味します。

単にmainそのものを評価しても、(\_ -> ...)の形か、
(コンストラクタ) ...の形になって...の部分は評価されずに終わります。
これでは...の中に書いてあるIOアクションの列をどう評価、
実行していけばいいかはわかりません。

そこで、mainは関数であって(type IO a = World -> (a, World)、
プログラムの実行とはmain worldを評価する、つまりmain worldの
返り値を求める評価を行うことだと考えることにします。

例えば(putStr "X") worldを評価すると、
"X"が出力されたWorldを返します("X"が出力される)。

256:デフォルトの名無しさん
04/10/16 05:15:13
これは、普通の評価なので、main worldの返り値(a, world)が求まれば
いいので、まず返り値に必要な部分から計算されます。
したがって、遅延評価ならば、a >> bにおいてworldに最後に関与する
「外側」にある"b"のほうから評価が行われるはずだということになります。
これが「右から(Lazyに)」の意味です。

ちろんこれではループも書けないのでIOモナドとしては使えません。
しかし、WorldについてStrictなモナドだとすれば、
左から評価されるようになります。

-- typeではモナドの定義がHaskell98では書けない。
newtype IO a = IO { runIO :: World -> (a, World) }
instance Monad IO where
    ioact >>= f = IO $ \world -> world `seq`
        let (a, world') = runIO ioact world 
        in  runIO (f a) $! world'

もしよくわからなければ、Control.Monad.Stateのlazyなstateモナドで
loopや末尾再帰のプログラムを書いて挙動を観察してみてください。

257:デフォルトの名無しさん
04/10/16 09:30:25
これに基づいて議論しませんか?

URLリンク(www.haskell.org)

258:デフォルトの名無しさん
04/10/16 10:36:55
>>257
基づいてないと?

IOの話なら、規格の性質を満たすIOはいかにして定義され得るか
ということを議論しているつもりなんだけど…

259:もなど初心者
04/10/16 18:27:11
なんかグダグダになってんのか話が進んでるのか判断できないんですが
デバッグ辛くないですか?

260:デフォルトの名無しさん
04/10/16 19:02:57
別に。 > デバッグ辛くないですか?

261:デフォルトの名無しさん
04/10/16 19:06:52
>>257のreportを見る限り,どちらの方法でもIOモナドの外部仕様を満たせるんじゃない?

The >>= operation passes the result of the first operation as an argument to the second operation.

ということなので,f >>= gに対して,fの中で起こる副作用がgの中で起こる副作用より先に起こる
ようにするには,

(1) >>=は,左辺の引数についてstrict
(2) g(正確にはgの中での副作用の呼び出し)がstrict

のどちらでもよい(ように思える).

262:デフォルトの名無しさん
04/10/16 20:00:26
>>261
> どちらの方法でもIOモナドの外部仕様を満たせるんじゃない?
だれが(1)を主張しているの?

> (1) >>=は,左辺の引数についてstrict
f >>= g のfが先に評価されるだけで、actionの実行とは関係ない。
例えば、f >> (g >> (h >> ..)) の無限列ができるだけでactionが実行されない
こともあり得る。

> (2) g(正確にはgの中での副作用の呼び出し)がstrict
なにがいいたいのかよくわからない。
Monadの話をしているのだから>>=の性質について話さないと。
>>255-256理論のことなのかな(そうは読めないけれど)。


それから、IOモナドはこれ
> Special operations (methods in the class Monad, see Section 6.3.6) 
> sequentially compose actions, 
> corresponding to sequencing operators (such as the semicolon) in imperative languages.
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
を要求してるからf >>= gのfが先に評価されるのであって、
>>261の部分からはそうなるとは限らないことに注意。(cf. LazyなStateモナド)

263:デフォルトの名無しさん
04/10/16 20:43:42
俺はHaskellのことは余りしらないんだけど、Haskellの言語仕様も
MLのように表示意味論(操作意味論でもいいけど)でformalに定義
されてるんじゃないの?

色々と仕様の背後にある意図を考えるのもいいけど、まずちゃんとした定義
を出してくれると素人には有難いなあ。言葉の定義も人によって違うみたいだし。
ちなみに

fがstrict <=> f(_|_) = _|_
lazy evaluation <=> λ計算でいうところのnormal reduction

ということでいいの?




264:デフォルトの名無しさん
04/10/16 21:33:21
>>263
> MLのように表示意味論(操作意味論でもいいけど)でformalに定義

IOはどうなんだろ?
URLリンク(citeseer.ist.psu.edu)
# 個人的にはHaskellのコミュニティはそういう文化じゃないと思ってる。
# formalなsemanticsがどうとかで論文書くんじゃなくて、
# 新しい便利なアイディアをどんどん導入して実際に使う。
# informalなsemanticsだけど気にしない、みたいなことがよく書いてあるきがする。
#
# そういうことに興味がないことによる偏見かもしれない。

ググッたらちょっと古い(1996)けどこんなのも
URLリンク(www-fp.dcs.st-and.ac.uk)
> No formal semantics for these I/O primitives is possible at present, 
> because there is no complete formal semantics for Haskell itself.

formalでないと理解した気がしないなら、
Concurrent Haskell (Simon PJ他)の論文でIOのsemanticsは誰かの論文を参照、
みたいなことが書いてあった気がするから、探してみたら。


> fがstrict <=> f(_|_) = _|_
> lazy evaluation <=> λ計算でいうところのnormal reduction
いいんじゃない。ちなみにdataコンストラクタはlifted。

265:デフォルトの名無しさん
04/10/16 22:00:24
normal order reduction ≠ lazy evaluation

266:デフォルトの名無しさん
04/10/16 22:26:55
>>265
等しくはないね。
でもλ計算でいうところのnormal-order reductionをするわけでしょう?

267:デフォルトの名無しさん
04/10/16 22:48:32
どうもありがとう。
Simon Peyton Jones, Andrew Gordon and Sigbjorn Finne. Concurrent Haskell, POPL, 1996.
をざっと見たところ、その辺の詳しい話は

Roy L. Crole and Andrew D. Gordon.
A Sound Metalogical Semantics for Input/Output Effects, CSL, 1994.
Andrew D. Gordon.
Functional Programming and Input/Output, Cambridge University Press, 1994.

を参照と書いてあった。暇なときにみてみよう。
ちなみに"Concurrent Haskell"の論文も結構面白い。IOの話については
下のような記述があった。ご参考…といってもここの人には常識か。

The sequencing combinators, >> and >>=, feed the result state
of their left hand argument to the input of their right hand
argument, thereby forcing the two actions (via the data
dependency) to be performed in the correct order.
...
In principle, then, a program is just a state transformer
that is applied to the real world to give a new world.
In practice, however, it is crucial that the side-effects
the program specifies are performed incrementally, and
not all at once when the program finishes. A state-transformer
semantics for I/O is therefore, alas, unsatisfactory, and
becomes untenable when concurrency is introduced, a matter to
which we return in Section 6.

268:Haskell???なにそれ?食えるの?
04/10/17 01:10:13
【ビギナ】初心者が習うべき言語は? part6【必読】
スレリンク(tech板:494-番)

おい。
Rubyにケチ付けてるこの馬鹿引き取ってくれよ。

269:デフォルトの名無しさん
04/10/17 01:41:49
ほっといてやれ

270:食べられません。
04/10/17 01:47:28
>>268
> Rubyにケチ付けてるこの馬鹿引き取ってくれよ。
事実誤認だよ。

>>269
ありがとう。

271:デフォルトの名無しさん
04/10/17 03:02:52
>>265
normal reduction = leftmost reduction = lazy reduction
じゃなかったっけ



272:デフォルトの名無しさん
04/10/17 03:09:20
eager evaluation と call-by-value が対応して
lazy evaluation と call-by-need が対応して

normal-order reduction というと call-by-name が対応するといいたいんじゃない?

273:デフォルトの名無しさん
04/10/17 11:45:11
>> 254
> なにかすごく賢い"評価器とは切り離された装置"
が必要性を判断してくれると仮定しなければ、
print $ [3, 1+2, 4] !! 0
で1+2が評価されない理由は説明できないと思う。
具体的にはその装置はHaskellの一部であって、
Haskellプログラムの内側では議論できない実装に近い部分の話になって
くるんじゃないかな。

>>255,>>256のような議論は有意義だと思うが、
上述したような「装置」によって、(:)と(>>)を同列に扱えるのであり、
(:)にその「装置」が必要とされている以上、
(>>)に他の特別な理論をあてはめるよりは、
必要に応じて評価される。という
lazy evaluationの原則を単純にあてはめればすむのではないかと思う。

ちなみに、
IOというものは[](リスト)と同様にそこにある何かであり、
たとえばputStrLn "Hello"が実行されると"Hello"を出力するのは、
[1,2,3]が(!!1)で2を返すのと同様にとらえられるのではないだろうか。

IOは評価時点では出力されずに、実行という次のステップで出力が生じる。
これは、
main = putStr "Hello " `seq` putStrLn "World"
での出力が
World
であるという点からも理解されるのではないだろうか。

HaskellのIOでは評価と実行は切り離されている。ということに今日気付いた。

274:デフォルトの名無しさん
04/10/17 13:33:11
「評価する」というのと「印字する」というのが微妙に混同されているような、いないような。

275:デフォルトの名無しさん
04/10/17 14:12:57
>>274
> print $ [3,1+2,4] !! 0
あたりのことを言われてるのかな?

Haskellにおいて、評価は印字などの動作によってしか引き起されない。
だから、とりあえず単純な印字の例を挙げただけ。

べつに
print $ replicate ([3,1+2,4]!!0) "foo"
のような例でもかまわない。
(当然この場合も1+2は評価されない。)

Haskellでは、IOに関連づけられなければ、式が評価されることはない。
対話的環境でも暗黙のprintがなされていると考えられると思う。
(ちなみに、対話的環境では返り値がIOならばそれの実行を、
それ以外だったらprintをするようになっているのだと思う。)

当然、print $ [3,1+2,4]!!0で、
1+2が印字されないことをもって、評価されないと言っているわけではない。
print $ [3,error "foo", 4] !! 0
で、エラーが生じないというのと同じことを言ったつもりである。

もしかしたら、もっと根本的な誤りを突いているのかもしれない。
そうだったらもう少し詳しい説明をよろしくおねがいします。

276:デフォルトの名無しさん
04/10/17 17:56:48
>>273
を読んで分かった…
君はlazy evaluationがそもそも分かってないんだorz

lazy evaluationが、「必要」に応じて評価されるのは、
> > なにかすごく賢い"評価器とは切り離された装置"
> が必要性を判断してくれると仮定しなければ、
こういうのがなにかが必要性を判断するわけじゃないよ。
単にoutermost leftmost reductionをしてるだけ。

質問に答えて欲しい。
(0) [3, 1+2, 4] !! 0 と length [0..] > 0 の評価はそれぞれどう進む?
(1) seqの初心者が陥りやすい誤解について説明せよ
(2) Stateモナドは自分で書ける? (Yes/No)
(3) その評価の順序が分かる? (Yes/No)
(4) (Lazy)Stateモナドで無限loopが書けないのはわかってる? (Yes/No)

> IOというものは[](リスト)と同様にそこにある何かであり、
リストモナドも自分で定義できるし…

277:デフォルトの名無しさん
04/10/17 18:17:15
>>275
> 対話的環境でも暗黙のprintがなされていると考えられると思う。
それってLispでいうrea-eval-print loopなんじゃないの?


278:haskell初心者
04/10/19 17:22:32
先月から勉強しているのですが、
haskellでn個の中から、m個を取り出す組み合わせの数、mCnのプログラムの書き方がわかりません。
だれか教えてください。お願いします。

279:デフォルトの名無しさん
04/10/19 17:31:30
宿題ですか?

せめて自分でどこまでやったか書け。


280:haskell初心者
04/10/19 17:36:04
課題です、すいません。
漸化式で作るところまでは考えたのですが、C++と違ってfor文が使えないので、
自分ではどうしたらよいかわからなくなってしまいました。

281:デフォルトの名無しさん
04/10/19 18:01:50
解1: マジメに計算する。階乗はどう書く? mPn はどう書く? 両方が出来
たら適切な引数を与えて割ればいいよね。

解2: mCn = .. + .. といった形で書ける。 .. と .. はどちらもコンビネー
ションだけど、 m と n の部分が少し小さい。で、m や n が 0 とか 1
だったらどうなるか、というのを考える。そしたら再帰で書けるよな。

という2つの考え方があるよ。

282:haskell初心者
04/10/19 18:06:43
なるほど!
ありがとうございました。

283:デフォルトの名無しさん
04/10/19 18:42:26
ここは優しいインターネッツですね

284:デフォルトの名無しさん
04/10/19 20:27:15
haskellの課題が出る講義があることに驚き。東大情報?
そのレベルの学生が再帰プログラムに不慣れなことにも驚き(失礼!)。


285:デフォルトの名無しさん
04/10/19 21:05:26
東大理情ではOcamlはやりますがHaskellはやりません。
工学部計数工学科(武市先生のいるとこ)ではHaskellをやる(人もいる)。

それにしても「関数型プログラムは理解し易くて初心者向き」なんじゃないのか...

286:デフォルトの名無しさん
04/10/19 21:39:10
東京工科大じゃないの?
URLリンク(www.teu.ac.jp)
と思ったけど課題内容が違うから違うのかな。

287:デフォルトの名無しさん
04/10/19 22:15:31
京都産業大学?

288:デフォルトの名無しさん
04/10/19 22:29:15
>>287
呼んだ?

289:デフォルトの名無しさん
04/10/20 02:30:38
漸化式が作れたのならプログラムのほとんどができたようなもんじゃないか

290:デフォルトの名無しさん
04/10/20 04:03:09
-- 数え上げobscured。c 10 3 などとして使う
c = flip ((length .) . filter . (. length . filter id) . (==)) . 
      (foldl ((=<<) . (. (return .) . (:)) . (>>=) ) [[]]) . (flip replicate [True, False]) 

291:デフォルトの名無しさん
04/10/20 18:34:44
ぐっ。↑を導いた過程の解説きぼんぬ。

292:デフォルトの名無しさん
04/10/20 18:53:01
コマンドプロンプトみたいなものを作ろうと思ってまず下のような単純なのを作って
hugsで動かしてみたら問題なく動いたのですが、ghcでコンパイルして実行すると、
プロンプト "$ " が表示されず、適当にキー入力したあと ":!" でループを抜けると、
入力した個数分のプロンプト "$ " がずらずらと表示されてしまいます。
ちなみに、ghciではhugsと同様に期待通りの動作です。
いったいどうすればghcでも期待通りの動作になるんでしょう?

main = do {
putStr "$ ";
str <- getLine;
case str of {
":!" -> return ();
_ -> main } }

ghcはver 6.2.2と6.2.1で試してみましたがどちらも同じ結果でした。

293:デフォルトの名無しさん
04/10/20 19:25:08
hFlush あたりを使うとよいのでは?

>>290 の導出過程希望。
まさか直接書いたの?

294:292
04/10/20 20:09:56
>293

putStrのあとに hFlush stdout を入れてやったらうまくいきました。

でも最初は実行順序が狂ってるのかと思ってしまいました。

295:デフォルトの名無しさん
04/10/20 22:40:10
>>294
ghcはターミナルではLineBufferingだから一行たまるまで出力されない。
hSetBuffering stdout NoBufferingを最初に書いてもいい。

>>291
>>293
手で地道にpoint-freeに書き換えました:-)
元は確か 
-- not tested
c n m = length $ filter ((m ==).length.filter id) $
            foldl (\ys xs -> [ x:y | x <- xs, y <- ys]) [[]]
                 $ replicate n [True,False]
こんな感じ。
自動化してフィルタプログラムにするとおもしろそう。

296:292
04/10/20 23:26:27
表示の問題は解決したんですが、他の部分に影響が出てしまいました。

プロンプトからの入力をParsecを使ってパースしようとしてるんですが、
文法の都合上Parsecのtryを使ってる部分があります。
hFlushとかstdoutは import IO しないといけないみたいなのでやってみると
そのtryを使っているところで

ERROR ".\test.hs":15 - Ambiguous variable occurrence "try"
*** Could refer to: System.IO.Error.try Text.ParserCombinators.Parsec.Prim.try

とかいうエラーが出てしまいます。(処理系はhugsです。ghcでも似たようなエラー)
どうしたら良いんでしょう?

一応パーサの部分とstdoutが必要な部分は完全に切り離されているので
パーサ部分を別のモジュールにしてやることで回避出来ることは確かめましたけど、
それ以外の方法はあるのでしょうか?

297:デフォルトの名無しさん
04/10/20 23:55:30
>>296
import qualified Text.ParserCombinators.Parsec as Parsec
して
Parsec.try と書くとか
import System.IO.Error ( hFlush, stdout, ... -- tryを以外だけリスト)
とか

For futher details, see section 5.3 of the Haskell 98 report.

298:292
04/10/21 00:45:52
>>297

ありがとうございます。
後者のやり方を使ってみます。

299:デフォルトの名無しさん
04/10/21 08:35:37
>>295
おおう、そのcならまともに読めますね。
((=<<) . (. (return .) . (:)) . (>>=)) の部分はやはりlist comprehensionからの変形か。
[[Bool]]が渡っているところをfuseして、さらに読解不能なコードにできるかもw


ところで、monadの話はどうなった。

300:デフォルトの名無しさん
04/10/24 15:41:02
なぜ、関数型言語は、Hello Worldを隠したがりますか?


301:デフォルトの名無しさん
04/10/24 15:43:54
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |       >>300
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /

302:デフォルトの名無しさん
04/10/24 17:18:58
Haskellはじめたばかりなのですが、よくわからないので教えてください。
a = "b"
b = 1
c = do
 "c"
d = do
 2
と書いて、dだけ、
*** Binding : d
*** Outstanding context : (Monad b, Num (b c))
と言われるのはなぜですか?


303:デフォルトの名無しさん
04/10/24 20:58:48
文字列は文字のリストで、リストはMonadクラスのインスタンスだから。
数値はMonadクラスのインスタンスではないから。

304:デフォルトの名無しさん
04/10/24 23:11:39
>>303
ありがとうございます。
doの中からは、Monadクラスのインスタンスを返すことは出来るけど、
他のものは返せないと。
doの中から数値を返したい場合はどうしたらよいのでしょうか?
Monadクラスのインスタンス作って返すしかないってことでしょうから、
returnを使って、IOモナドを返せばいいということなのでしょうか?
IOモナドって使わなくてすむなら使わないほうがいいみたいなのですが、
数値を返す関数はdo使わなくてもかけるだろうってことなのかな?
Haskellは難しいです。頭がクラクラします。


305:デフォルトの名無しさん
04/10/25 00:15:45
>>304
> doの中から数値を返したい場合はどうしたらよいのでしょうか?
一般には無理。リスト等、中身を取り出せるモナドもある。
f :: Int
f = head $ do return 3

> 数値を返す関数はdo使わなくてもかけるだろうってことなのかな?
なんでモナドが使いたいのかわからない。
例えばどんな「数値を返す関数」にモナドを使おうと思うわけ?

306:デフォルトの名無しさん
04/10/25 01:22:05

       ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´ 曲`)  < モナドナ♪ドーナー♪ドーナー♪
      ⊂    )つ \_____________
       (_⌒ヽ
         )ノ `J


307:デフォルトの名無しさん
04/10/25 08:27:33
>>304
引数をとらずに数値を返す関数を書きたいということですか。
Haskellの場合、引数なしの関数は値そのものとまったく同じものになります。
C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、
Haskellではsome = 3 :: Intとなり両者の区別は存在しません。

また、doの意味を誤解しているようですね。
doというのはある種のシンタックスシュガーで、
do a
b
c
という表記は a >> b >> cというように解釈されます。
この(>>)はMonadクラスで定義された関数なので、
doをMonadクラス以外のものに適用しても意味がありませんし、
doの後に式がひとつの場合も意味がありません。

Haskellの考え方になじむまでは難しく感じると思いますが、
段階をふんで理解していけば大きな困難はないと思います。
hugsでいろいろな関数をつくって遊んでみることをおすすめします。
洋書ですが、「The Craft of Functional Programming」がおすすめです。

308:デフォルトの名無しさん
04/10/25 08:50:08
>>307
訂正
do a
   b
   c

309:デフォルトの名無しさん
04/10/25 11:14:48
>>307
> C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、
> Haskellではsome = 3 :: Intとなり両者の区別は存在しません。

int rand(void) に相当するものはどうなるのでしょうか?


310:デフォルトの名無しさん
04/10/25 11:46:20
>>309
Haskellでは関数は毎回同じ値がかえってこないといけないので、
そのようなものはありません。

では乱数はどうするかというと、
ramdom :: (RandomGen g) => g -> (a, g)
のように、generatorを渡して乱数を生成し、次のgeneratorを
返すことで実現します。

実際にはこのままでは使いにくいので、
randoms :: (RandomGen g) => g -> [a]
と無限リストにするか(これがお薦めです)、
C言語と同じ様に副作用によってgeneratorの状態を保存するために
モナドを用います。

# System.Randomで乱数関係の関数が定義されています。

311:me /= 309
04/10/25 11:54:05
>>310
こういう、Haskell風の思想を交えた解説は新参者にとって非常に参考になります。


312:304
04/10/25 13:46:10
出来れば、あまり人に頼らず勉強したいところなのですが、、、
申し訳ないのですが、考え方があまりに違うので、質問させてもらっています。
詳しく解説していただけて、非常に感謝しております。頭が下がります。
>>305
モナドを使いたくて、doを使っているわけではありません。
doを使いたくて知らないうちにモナドを使っていたようです。
>>306
doについてよく理解していないことがわかりました。
単にc言語の{}に対応した表現が出来るものだと思っておりましたが、違うのですね。

洋書は気合入れて買ってみても、
結局、挫折することは目に見えているので控えさせていただきます。
翻訳版が出るとうれしいです。

関数は同じ値を返さなくてはならないというのも面白いですねぇ。
>>311
ありがたい話しです。

モナドもよくわからない、Haskellのジェネレータもよくわからない。
とにかく、わからないことずくめなので、ゆっくり腰を据えて勉強するしかないなぁ。
Java知ってるから、C#も1日でだいたいわかるって具合には行かないですねぇ。


313:デフォルトの名無しさん
04/10/26 00:20:02
関数型のプログラムのコツは写像を追うことです、
JavaとかCとかやってると、どうしても手続きに目がいってしまって最初は全然まともに組めないです。
他にも、プログラム中に時間概念が無いので時系列を作り出す必要があるという点にも馴れにくかったです。
この辺はまるで相対論よろしく時間を次元の一つとして捉えて4次元空間的を直接取り扱う感覚を覚えました、
そんな感じで、過去から未来まで全部お見通しの神様の気分でプログラムしてます。
こんな感覚になるまで、僕もかなりの期間悩みました。
乱数なんかもそうですよね、あらかじめ無限個ある全ての乱数を作って置いておくという、
Javaなんかやってると、この感覚はそう簡単にはなじめないですね。

314:デフォルトの名無しさん
04/10/27 17:44:25
---------------------------
import Numeric
f :: Float -> Int -> Float
f x n = sin (pi*x*(2*n+1))
-----------------------
このプログラムがエラーになる理由を教えてください。
型が不一致といわれるのですが。


315:デフォルトの名無しさん
04/10/27 17:58:07
>>314
n が何なのか知らないが、pi は Float ではなくて?

316:デフォルトの名無しさん
04/10/27 18:04:16
nは整数(自然数)のつもりです。
piは標準ライブラリ定義されているFloatの定数だと思います。
この関数定義自体が出来ないみたいなんですが。

317:デフォルトの名無しさん
04/10/27 18:43:04
>>314
型があわない。

f x n = sin ( pi * x * (2.0 * (fromIntegral n) + 1.0))


318:デフォルトの名無しさん
04/10/27 18:43:12
>>314
型の不一致。
(*) :: Num a => a -> a -> a
なので、例えばaがIntでは、Int -> Int -> Intとなり、
aがFloatならば、Float -> Float -> Floatとなる。
違う型同士のかけ算はできない。
この場合、fromIntegralを利用して以下のようにすればいい。
f :: Float -> Int -> Float
f x n = sin (pi*x*(2*fromIntegral n+1))

319:デフォルトの名無しさん
04/10/27 19:04:19
ありがとうございます。
fromIntegralで型変換(?)しなきゃ掛け算できないんですね。
ちょっと面倒ですけど、rubyで(1/n)とやるとn>=2で0になってしまう(←これが分からず何時間もロスした^^;)
とかよりは明確でいいんですかねぇ。


320:デフォルトの名無しさん
04/10/27 19:08:53
追加です。
c x t n = (4.0/pi) * exp (-pi^2*t*(2*fromIntegral n+1)^2) * sin (pi*x*(2*fromIntegral n+1)) + (c x t (n - 1))
c x t (-1) = 0
これで「c0.5 0.001 10」を評価するとスタックオーバーフローしてしまう理由を教えてください。

321:デフォルトの名無しさん
04/10/27 19:35:19
これは関数定義の順番の問題。
Haskellでは、先に書かれたものから順にパターンマッチが行われるため、
c x t n = ...はnに対する条件がないため、
nが-1のときもこっちが適用されてしまい、無限ループにおちいる。
c x t (-1) = 0
c x t n = ...
の順に並べれば問題は解決する。

322:デフォルトの名無しさん
04/10/27 22:11:34
URLリンク(www.teu.ac.jp)
ここで使っている、
文字→コード ord :: Char -> Int
コード→文字 chr :: Int -> Char
という関数が定義されていないようです。
環境はwindows 2000 でhugsを使っています。
:versionと入力すると、以下のように出ます。
-- Hugs Version Nov 2003
:browse Preludeとしてみてもordという関数はないので
バージョンUPして使えなくなったということでしょうか?


323:デフォルトの名無しさん
04/10/27 22:38:22
Prelude> :l Char
Char> :t ord
ord :: Char -> Int

324:デフォルトの名無しさん
04/10/27 23:04:58
>>319
わざわざ Float->Int->FloatにしようとするからfromIntegralが
必要になる。

f x n = sin ( pi * x * (2 * n + 1))

だけで明示的に型を指定するのやめれば

*Main> :t f
forall a. (Floating a) => a -> a -> a

という型になるがあとは勝手にやってくれるよ。


325:デフォルトの名無しさん
04/10/27 23:10:08
あーでもそれじゃnに整数以外の数つっこめちゃうのでだめか。



326:320
04/10/28 22:17:40
>>321
ありがとうございます。gnuplotでグラフを書かせるためのファイルを
出力しようと目論んでいるのですが、rubyより知的な気分ですね。

可読性はどうなんでしょう。
多少字面は見づらいけど、数学みたいに書けて
コンピュータ特有のことを考えないで済む分楽かもしれませんね。


327:デフォルトの名無しさん
04/10/29 01:33:14
>>323
なるほど。:loadしないと使えないのですね。
runhugsやGHCで使う場合というか、ファイルに書いておいて使う場合は、
(なんていったらよいのでしょう?)
import Charすればよいのですね。わかりました。

ありがとうございます。


328:デフォルトの名無しさん
04/11/03 13:44:05
みんなこの言語使って何やってるの?

329:デフォルトの名無しさん
04/11/03 15:47:57
「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。
関数型って言うんだけどね。」
「すごーいよく分からないけどかっこいいー」

330:デフォルトの名無しさん
04/11/03 16:40:43
「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。
関数型って言うんだけどね。」
「すごーいよく分からないけどかっこいいー。じゃあ、今晩はカレーにしようか?」

331:デフォルトの名無しさん
04/11/03 17:16:56
今晩はカリーか。

332:デフォルトの名無しさん
04/11/03 17:18:14
今晩はカリだ。

333:デフォルトの名無しさん
04/11/03 20:22:31
アライグマ Haskell

334:デフォルトの名無しさん
04/11/05 01:38:12
>>328
言語習いたてのワクワクをモ一度味わいたくて。
とりあえずKISSローダ作るのが目標です。

335:デフォルトの名無しさん
04/11/05 08:51:13
KISSローダってなんですか

336:デフォルトの名無しさん
04/11/21 20:03:44
CommonLisp/Scheme と Haskel と ML の中で一番実用に近いのは何?
私は CommonLisp だと思うんだけど。

337:デフォルトの名無しさん
04/11/21 20:09:03
>>336
比較対象が微妙に違っているわけだが。

338:デフォルトの名無しさん
04/11/22 09:26:06


339:デフォルトの名無しさん
04/11/22 11:49:50
すみません。最近勉強を始めた者ですが、頭が悪いものでどうにもわからず
困っています。よろしければご教授願えませんでしょうか。
3つをまとめる関数 zip3 を zip を用いて定義せよ、という問題で
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs
where
change :: [((a,b),c)] -> [(a,b,c)]
change [((x,y),z)] = [(x,y,z)]
zip3 _ _ _ = []
というものを考えたものの、どこがどう悪いのか自分ではわかりません。
1週間悩んで進展なしで独力では無理なようなので、どなたかお教えいただけませんでしょうか?


340:デフォルトの名無しさん
04/11/22 12:36:43
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 xs ys zs = map change $ zip xs (zip ys zs)
where
change (x,(y,z)) = (x,y,z)

341:デフォルトの名無しさん
04/11/22 15:58:39
>>339
型があってない。っていうかzip使ってない。

> zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs
x , y, z :: aだから zip x y とはできない。(もともとa = [b]でないかぎり)
zip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs
と書こうとしてるわけだからこれではzipの使いようがない。

参考>>184の上半分
zip3 x y z = (,,) <$> x <-> y <-> z

342:デフォルトの名無しさん
04/11/23 10:14:37
{-
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = (f x y) : (zipWith f xs ys)
zipWith f [] _ = []
zipWith f _ [] = []

zip :: [a] -> [b] -> [(a,b)]
zip xs ys = zipWith mkpair xs ys
  where
    mkpair x y = (x, y)
-}
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 xs ys zs = zipWith mkpair xs (zip ys zs)
  where
    mkpair x (y, z) = (x, y, z)


343:デフォルトの名無しさん
04/11/23 11:56:51
zip3' = (zipWith (uncurry (,,)) .) . zip

344:デフォルトの名無しさん
04/11/23 17:24:36
zip3' = const zip3 zip

345:デフォルトの名無しさん
04/11/24 12:28:10
339です。自室のPCからでははじかれてしまって書き込みができなかったので
遅くなってしまいましたが、ありがとうございます。
たいへん助かりました。
…お礼の言葉が遅くなってしまい、申し訳ありませんでした。m(__)m


346:デフォルトの名無しさん
04/12/08 23:32:07
-- Haskell Mode

Haskell Haskellモード 関数型言語でーす

Haskellモード Haskellモード Haskellモード Haskellモードでーす
Haskellモード うにゃ~ うにゃにゃ lazily evalute!

関数 … カリー様 関数 … か・た・す・い・ろん
モナド >>= … わたしのシモベェ~ モナド >>= …

Haskellモード Haskellモード Haskellモード 98モードでーす
Haskellモード Haskellモード Haskellモード Haskellモードでーす

たらい、回したくなっちゃった…


347:デフォルトの名無しさん
04/12/25 20:17:26
>>346
大丈夫?

348:デフォルトの名無しさん
04/12/26 01:33:03
Everyday Haskell
URLリンク(www.sampou.org)
が面白い


349:デフォルトの名無しさん
04/12/26 03:05:21
fold右派とfold左派にワラタ

350:デフォルトの名無しさん
04/12/27 03:20:36
The Evolution of a Haskell Programmerでググれ
という話ではなかったようだなスマソ

351:デフォルトの名無しさん
04/12/27 23:20:33
これ既出?
URLリンク(www.cin.ufpe.br)

352:デフォルトの名無しさん
05/01/05 13:43:39
>>347
346の文字列を読んで、ラテン系の伴奏が聞こえてくるようだと
かなりダメ。

353:デフォルトの名無しさん
05/01/06 03:09:05
>>346
禿げワロス
カリー様(・∀・)イイ!!

354:デフォルトの名無しさん
05/01/12 23:45:50
保全sage

355:デフォルトの名無しさん
05/01/15 03:17:13
Hatena::Diary 「Haskell」を含む日記
のとある日記を見てちょっとワラた

「むしゃくしゃしてやった.Haskell で書くつもりはなかった.今は反省している.簡潔に書けるが,知らない人には全く読めないだろうし,知っている人はもっとうまく書くかもしれない.」


356:デフォルトの名無しさん
05/01/15 03:36:47
ocaml age

357:Aransk
05/01/18 12:16:33
>>355
ワラた。
++ "しばらくしたら…誰も読めなくなるだろう。"

358:デフォルトの名無しさん
05/01/23 14:46:59
The Implementation of Functional Programming Languages オンライン復刻記念
URLリンク(research.microsoft.com)

って既出?

359:デフォルトの名無しさん
05/01/24 10:44:32
>>358 おおっ! 既出ではないと思う。さんくす。
といいつつ書籍で持ってるのだがw。いい本だよねー。



360:デフォルトの名無しさん
05/01/24 10:56:09
OCamlだとMLっぽいから書きやすいんだけど…。

361:デフォルトの名無しさん
05/01/24 18:01:20
>>358
やけにでっかいから何かと思ったら、300もあるページがみんな画像……

362:デフォルトの名無しさん
05/01/25 02:46:41
Revision Control System を、調べてたら、
darcs ( URLリンク(abridgegame.org) )
というのを、ハケーンしました。
これは、haskell で書かれているので、「haskellってなんや。」と調べる流れでここに来ました。

私が知らないだけ、haskellでかかれたアプリはいっぱいあるのかも知れませんが、
上の方に出てないみたいなので、書いてミマス。

激しくガイシュツでしたらすいません。

363:デフォルトの名無しさん
05/01/25 15:14:39
haskellで書かれたアプリはそんなに珍しくないと思う。
URLリンク(www.haskell.org)
にいくつか載ってる。

364:デフォルトの名無しさん
05/01/25 15:17:08
haskellとOCamlではどちらがメジャーですか?

365:デフォルトの名無しさん
05/01/25 15:25:18
そういうのをドングリの背比べというのではないだろーか。

366:デフォルトの名無しさん
05/01/25 16:01:51
スラド本家?とLtUで取り上げられた<darcs
URLリンク(it.slashdot.org)
URLリンク(lambda-the-ultimate.org)

純粋に関数的な「パッチの適用」を,ファイルやディレクトリの読み書きからキレイに分離でき,
また,パターンマッチングと高階関数が,パッチのプリミティブの実装にとてもマッチする,とある.

詳しくはこちら.
URLリンク(osdir.com)

367:デフォルトの名無しさん
05/02/06 15:35:00
>>346
超ワロタw

368:デフォルトの名無しさん
05/02/06 19:52:48
>>367
元ネタキボンヌ


369:346
05/02/06 20:18:15
>>368
スレリンク(gline板:1-9番)

370:デフォルトの名無しさん
05/02/07 04:10:20
ぬるほど

371:デフォルトの名無しさん
05/02/09 05:46:41
Haskellの初歩を学校でやっているのですが、
宿題が出て難しすぎるので誰か助けて下さい。

372:デフォルトの名無しさん
05/02/09 10:53:26
2つの項を入力されたらmost general unifierを出力する
*(1,y) *(x,+(a,b)) -> {x->1,y->+(a,b)}
のようなプログラムを作れ、という課題が出たのですがサッパリわかりません。
どなたか教えて下さい


373:デフォルトの名無しさん
05/02/09 20:23:43
>>372
もう一年やれば、理解も深まるよ。

374:デフォルトの名無しさん
05/02/09 20:27:03
というか,課題が全然理解できないんだが.

375:デフォルトの名無しさん
05/02/09 20:42:11
あ,分かってしまった.もう一年がんばってね.

376:デフォルトの名無しさん
05/02/09 20:59:08
問題の意味がわからないのならどうしようもないな

377:デフォルトの名無しさん
05/02/09 22:14:31
>>372
これ、数学板のmathematicaスレでも見たぞ
マルチすんな、消えろ

378:デフォルトの名無しさん
05/02/09 23:27:11
もっと低レベルな人にあわせてくれる学校に入りなおしましょう。


379:デフォルトの名無しさん
05/02/09 23:49:57
>>370
カッ

380:デフォルトの名無しさん
05/02/10 01:16:45
[1,5,8,43]などのリストをパラメータとして受け取って
[("1st",43),("2nd",8),("3rd",5),("4th",1)]のように
ランクをつけてランク順に返す関数が欲しいのですが
問題は[5,6,6,22,23,24,24]のような場合に
[("1st",24),("1st",24),("3rd",23),("4th",22),("5th",6),("5th",6),("7th",5)]
のように返さなければいけないことです。どうすればいいかさっぱりです。
誰か教えて下さい。


381:デフォルトの名無しさん
05/02/10 02:07:40
List> group $ reverse $ sort [5, 6, 6, 23, 24, 24]
[[24, 24], [23], [6, 6], [5]]
ここまで来りゃ後はなんとでもなるだろ。

382:デフォルトの名無しさん
05/02/10 02:35:51
>>381
ありがとうございます!!

383:デフォルトの名無しさん
05/02/10 02:43:00
あ、ランクを付ける際にはカウンタみたいなものを用意するんですか?

384:デフォルトの名無しさん
05/02/10 04:08:38
宿題か? 宿題なのか? テメエェェェ

385:デフォルトの名無しさん
05/02/10 07:31:12
>>381
演算子 $ って初めて見ましたが,なかなか便利ですね.
勉強になりました.

386:デフォルトの名無しさん
05/02/10 09:38:36
はい、そーです

387:デフォルトの名無しさん
05/02/10 23:12:49
> ここまで来りゃ後はなんとでもなるだろ。

いろいろ考えたのですがなんともなりません。
むしろここから先が一番大変なのではないかと・・・
まじで教えてくれませんか?

388:デフォルトの名無しさん
05/02/10 23:27:15
ここまで来てなんともならんてのは、けっきょく全然理解してないってことだ
ろ。これくらい自分で考えてみ。でないとただのカンニングだろ。


389:デフォルトの名無しさん
05/02/11 03:20:58
僕にはこれが限界でした。

rank :: [[a]] -> [(Int, a)]
rank x = [(i, n) | (i, a) <- zip [1..] x, n <- a]

確かに理解は非常に足りません。ですが、本を読んでも、
いろいろなほかのテクニックを知ってもループという基本的なことを
するのがこんなに難しい言語は初めてなのです。
なんらかのライブラリを使う必要があるのかもしれないと思って、
Listのところは大体見たんですが結局何も見当たらずもうダメです。
こんな簡単であろう問題に3時間も4時間もかけてる自分がすごい嫌になってきます。


390:デフォルトの名無しさん
05/02/11 04:03:59
ま、気楽にやれや、学生なんだし。

391:デフォルトの名無しさん
05/02/11 04:52:51
そう気楽でもないんすよ。いろいろあって。
ヒントを下さい。お願いします。

392:デフォルトの名無しさん
05/02/11 08:05:13
>>391
[1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。
英語のカウントに勝手に直してくれるようなライブラリはないだろうな。

393:デフォルトの名無しさん
05/02/11 09:27:09
>>392
> [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。

そのリストはどこまで続くんですか?

394:デフォルトの名無しさん
05/02/11 09:48:51
いや、それじゃランク順の法則が違うんですよ。それだと
[("1st",24),("1st",24),("2nd",23),("3rd",6),("3rd",6),("4th",5)]
になっちゃうんですよ。

課題は
[("1st",24),("1st",24),("3rd",23),("4th",6),("4th",6),("6th",5)]
にならなきゃいけないので前のリストのカウントを常にしないと次のランクが
分からないわけです。これをどうしたものかと・・・・

>>393
同じ課題で悩んでる人ですか?そのリストは(length x -1)thまで続くんじゃないでしょうか?

与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。

addSuffix :: Int -> String
addSuffix x
| x == 1 = "1st"
| x == 2 = "2nd"
| x == 3 = "3rd"
| otherwise = show x ++ "th"

395:デフォルトの名無しさん
05/02/11 10:08:15
>>394
> にならなきゃいけないので前のリストのカウントを常にしないと次のランクが
> 分からないわけです。これをどうしたものかと・・・・

rankingの関数が、
1)降順ソートずみ整数の(部分)リスト (初期値 全リスト)、
2)これまでに処理した整数の数 (初期値 ゼロ)、
3)直前に処理した整数 (初期値 -1とか、入力リストに絶対あらわれないもの)、
4)直前に処理した整数のランク (初期値 ゼロ)、
のよっつを引数として取ればいいんじゃないの?

> 与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。
> | otherwise = show x ++ "th"
これだと
21番目は "21th"
22番目は "22th"
になっちゃうよ……


396:デフォルトの名無しさん
05/02/11 10:51:06
あ、ほんとだ!ご指摘ありがとうございます。
じゃぁ条件分岐のところ、xの代わりにmod x 10で。

rankingの関数はやはり4つも引数が必要ですか・・・・。
じゃぁそれでちょっと頑張ってみます。

397:デフォルトの名無しさん
05/02/11 11:01:33
ちょっとやり方は違うけど4つの引数使ってやっとできました。
でもなんかぎこちない感じ・・・。これでいいのでしょうか。
もっとスマートなやり方があるような気がしてなりません。

setRank :: [Int] -> [(String, Int)]
setRank [] = []
setRank (x:xs) = ("1st", x):[(addSuffix a, b) | (a, b) <- subSetRank xs x 2 0]

subSetRank :: [Int] -> Int -> Int -> Int -> [(Int, Int)]
subSetRank [] _ _ _ = []
subSetRank (x:xs) preVal position k
| x == preVal = [((position - (k+1)), x)] ++ (subSetRank xs x (position+1) (k+1))
| otherwise = [(position, x)] ++ (subSetRank xs x (position+1) 0)

addSuffix :: Int -> String
addSuffix x
| mod x 10 == 1 = "1st"
| mod x 10 == 2 = "2nd"
| mod x 10 == 3 = "3rd"
| otherwise = show x ++ "th"


398:392
05/02/11 11:01:34
>>394
失礼。俺なら395よりは、
groupBy (\x y -> snd x == snd y) $ zip [1..] $ reverse $ sort [5, 6, 6, 23, 24, 24
]
から変形するな。

399:どうでしょうか,,,
05/02/11 11:11:26
import List
rank :: Integer -> String
rank x
| x `mod` 10 == 1 = s ++ "st"
| x `mod` 10 == 2 = s ++ "nd"
| x `mod` 10 == 3 = s ++ "rd"
| otherwise = s ++ "th"
where s = show x

ranks :: [String]
ranks = map rank [1..]

sort_group :: Ord a => [a] -> [[a]]
sort_group l = group $ reverse $ sort l

main :: Ord a => [a] -> [(String,[a])]
main lst = zip ranks (sort_group lst)

400:デフォルトの名無しさん
05/02/11 11:14:24
>>399
全然違うじゃないか。
それにmainはIO aの型であるべきもので、使わないほうがいい。

401:デフォルトの名無しさん
05/02/11 11:21:27
誰も書かないから突っ込むけど、
11th,12th,13th

そんな私はsort使うためにimport Listするとhugsにレイアウトが違うと怒られる駄目駄目プログラマ。

402:401
05/02/11 11:27:11
importがImportになってた スレ違い御免orz

403:デフォルトの名無しさん
05/02/11 11:28:33
どうもありがとうございます。おかげ様で前のよりはマシになったかと思います。

setRankS :: [Int] -> [(String, Int)]
setRankS x = concat [setFirst n | n <- (groupBy (\x y -> snd x == snd y) $ zip [1..] x)]

setFirst :: [(Int, Int)] -> [(String, Int)]
setFirst ((x, y):xs) = [(addSuffix x, b) | (a, b) <- ((x, y):xs)]


404:デフォルトの名無しさん
05/02/11 11:41:07
>>401
またまた貴重なご指摘ありがとうございます。

addSuffix :: Int -> String
addSuffix x
| x == 11 = s ++ "th"
| x == 12 = s ++ "th"
| x == 13 = s ++ "th"
| mod x 10 == 1 = s ++ "st"
| mod x 10 == 2 = s ++ "nd"
| mod x 10 == 3 = s ++ "rd"
| otherwise = s ++ "th"
where s = show x


405:401
05/02/11 11:52:24
あーごめんなさい。私もまだ間違ってた。
111th,112th,113th,211th....。序数詞は怖い。もうないよね。

406:デフォルトの名無しさん
05/02/11 12:03:11
| mod x 100 == 11 = s ++ "th"
| mod x 100 == 12 = s ++ "th"
| mod x 100 == 13 = s ++ "th"

これ足せばOK?

407:デフォルトの名無しさん
05/02/13 13:11:54
宿題しか話題のない悲しい言語

408:デフォルトの名無しさん
05/02/13 15:11:50
>>407
> 宿題しか話題のない悲しい言語
達見かな。で、どうしてそうなのかという質問がなされ、欠点が羅列され、
いやそんなことはない理論的に美しいという反論が出て、数少ない実用例も示され……

409:デフォルトの名無しさん
05/02/13 16:36:48
関数型言語なんてみんなそうなんじゃない?
Lisp系は処理系が簡単だから使われるけど、それ以外は…


410:デフォルトの名無しさん
05/02/13 17:23:54
初心者を馬鹿にするとき、一番盛り上がります。

411:デフォルトの名無しさん
05/02/13 17:32:09
>>409
OCamlをフリーソフト(非オープンソース)を書くのに使っていますが。

412:デフォルトの名無しさん
05/02/13 18:02:27
じゃあ、みんなでHaskellで言語処理系を作ろう。

413:デフォルトの名無しさん
05/02/13 18:21:28
Haskellでテトリスは作れますか?

414:デフォルトの名無しさん
05/02/13 18:26:54
>>413
作れます。

415:デフォルトの名無しさん
05/02/13 18:33:34
Haskellのテトリス↓
URLリンク(web.comlab.ox.ac.uk)
URLリンク(fxp.hp.infoseek.co.jp)

416:デフォルトの名無しさん
05/02/13 18:55:01
ghcってどれくらいきちんとdebugされてるのかなあ。
仕事に使っても大丈夫?

417:デフォルトの名無しさん
05/02/13 22:14:38
>>411
こういうコンテキストで話すなら、商用に使われてナンボだと思うが。
俺自身は宿題用だろうが日曜プログラマーの趣味の道具だろうが構わんけど。


418:デフォルトの名無しさん
05/02/14 15:53:01
>>416
まあオープンソースだから、sourceforge.net/projects/ghc/やメーリングリストを見て
自分で判断してくださいということで。


ver6.4のリリースが延び延びになっているのが気になる。
RCのソースもコンパイルできないし…(@Mac)

419:デフォルトの名無しさん
05/02/14 20:24:12
そうそう。
あくまでも最先端の研究用なので、品質に期待してはいけない。

420:デフォルトの名無しさん
05/02/19 08:34:16
C,C++の代わりとまではいかなくても、
Perlの代わりぐらいにはなりますか?

421:デフォルトの名無しさん
05/02/19 11:17:33
>>420
もう少しHaskellのこと勉強してから出直してきたら

422:デフォルトの名無しさん
05/02/19 12:09:32
>>421
言語の完成度じゃなくてghcの完成度を聞いてるんだけど。

423:デフォルトの名無しさん
05/02/19 13:10:18
エスパー募集中ですか(w

424:デフォルトの名無しさん
05/02/19 23:54:19
ghcってとてもバグが少ないとおもう。
特に、コンパイル結果がおかしいというのは一つも知らない。
言語拡張を使ってコンパイラが落ちるのはあったが、gccだってよく落ちたし。

品質に期待してはいけないってのは、なんか具体的な理由があるの?

425:デフォルトの名無しさん
05/02/22 20:08:41
GHC最強。ノアだけはガチ。

426:デフォルトの名無しさん
05/02/22 22:01:11
ghcは完璧。バグなんて有り得ない。

427:デフォルトの名無しさん
05/02/23 09:12:55
URLリンク(www.ghc.or.jp)


428:デフォルトの名無しさん
05/02/23 19:20:04
ghcの品質に問題ありとかいってる奴は頭がおかしいな。

429:デフォルトの名無しさん
05/02/23 20:51:01
関数型言語で書かれてないソフトウェアなんて
信頼性低すぎて使ってられないよな。

430:デフォルトの名無しさん
05/02/23 21:14:20
ghcにはバグなんてない。
ghcの信頼性 >>>>>>>>> gccの信頼性

431:デフォルトの名無しさん
05/02/24 11:00:34
     カタカタ
  || ̄ Λ_Λ
  ||_(Д`; ) 「なに?このスレ・・・」
  \⊂´   )
    (  ┳'

432:デフォルトの名無しさん
05/02/26 23:31:32
妙な雰囲気を紛らわす一服の清涼剤sage

URLリンク(pggirls.asukaze.net)イ霖�/Haskell、ソ、�

433:デフォルトの名無しさん
05/02/27 03:01:22
ghcにバグがないことは証明済みです。

434:デフォルトの名無しさん
05/03/02 14:39:26
The Monad.Reader
URLリンク(www.haskell.org)


435:デフォルトの名無しさん
05/03/05 17:27:02
証明が間違ってないことも証明済みです

436:デフォルトの名無しさん
05/03/05 21:47:09
よく分からんが、ghcにバグは有り得ないってことか。

437:デフォルトの名無しさん
05/03/06 11:08:10
そゆこと

438:デフォルトの名無しさん
05/03/08 23:33:41
URLリンク(sourceforge.net)


439:デフォルトの名無しさん
05/03/09 00:11:32
ghcってのは宗教か何かですか?

440:デフォルトの名無しさん
05/03/09 00:24:00
真理です

441:デフォルトの名無しさん
05/03/09 20:45:50
我々はこのスレを笑い飛ばしていたものです…。
しかし、その後、、、

442:デフォルトの名無しさん
05/03/10 00:24:38
テレビで観た外国人犯罪者。刑務所で個室をもらい、支給されたパソコン
でお勉強。本国から雑誌や新聞、書籍を送ってもらい、専属の通訳と翻訳家
つきで、食事はその国にあわせたもの。日本人受刑者は狭い部屋ですし詰め。
しばらくして、別のニュースでホームレスが川に落ちたインスタントラーメンを
取ろうとして転落、そのまま凍死してしまったという記事を読んで、せつなくな
ってしまった。
新聞で日本で暮らす脱北者のインタビュー記事。「生活保護の支給額が足りない」
「支援してくれないので日本は冷たい」だと。
別の記事で生活保護を受けられなかった母子がおんぼろアパートで餓死。
この国は本当に狂っている。

443:デフォルトの名無しさん
05/03/10 00:32:05
・・・という内容をghcで矛盾を含まずーディングしはじめる兵(ツワモノ)が現れるのを
目の当たりにすることになったのです。  ~Fin.~   (2ch.千夜一夜物語)

444:デフォルトの名無しさん
05/03/10 00:58:20
真理です

445:デフォルトの名無しさん
05/03/11 00:20:02
生活苦や迫害から逃れるため北朝鮮を脱出した元在日朝鮮人
大阪府八尾市に支援者が用意した2部屋のアパートで
月約17万円の生活保護と支援者からのカンパで暮らす。

ソウルに住む長男も呼び寄せたいというが、
「いまの生活保護額では厳しい」と悩む日々だ。

URLリンク(www.asahi.com)

         確定申告済ませたか?

      俺も17万円と2部屋のアパート欲しい。      
   豊な生活送るには、17万円ポッチじゃ、まだタリン。 
     おまえ等の税金もっともっと よ こ せ!

446:デフォルトの名無しさん
05/03/11 00:31:20
ghcならコンパイル可能

447:デフォルトの名無しさん
05/03/11 00:43:13
ghcだからこそコンパイルエラーの結果に終わります。 こんなんに真値判定出されてたまりますか。

448:デフォルトの名無しさん
05/03/12 20:33:41
URLリンク(www.haskell.org)

449:デフォルトの名無しさん
05/03/12 23:28:12
新たな教典が来ましたね。
もちろんバグはありませんので、安心してご利用ください。

450:デフォルトの名無しさん
05/03/13 02:47:22
>>449 =モズクズ様↓
URLリンク(www.gema3.net)

451:デフォルトの名無しさん
05/03/14 14:32:35
SOE本とCraft本で、どちらがお勧めですか?

452:デフォルトの名無しさん
05/03/14 16:41:23
>>451
両方

453:デフォルトの名無しさん
05/03/14 23:22:35
今年度は、Hugsの新版出ないの?

454:デフォルトの名無しさん
05/03/15 00:02:58
Mar 2005 releaseがでてるけど

455:デフォルトの名無しさん
05/03/15 08:28:37
あれ、いつの間に。

456:デフォルトの名無しさん
05/03/15 08:32:05
Charが、うにコードに対応したんだ。

457:デフォルトの名無しさん
05/03/20 10:13:33
hugs98-Mar2005-patched.tar.gzキテル━━━(゚∀゚)━━━ !!!!!
updated with urgent bug fixes

458:デフォルトの名無しさん
05/03/23 00:58:19
同じ関数型言語でもHaskellのほうがSchemeより易しくない?
SMFの解析を書き始めてるけど、コストをあまり考えすぎなくてよい気がするし、
Schemeよりも簡潔に書けるし、実行速度もいくぶん速い。
いまのところ、手続き型の処理を書かなくても
(コストを気にしない限りは)それほど書くのが難しくない。
ただ、効率を気にしだすと書き換えるのは難しいのかな?

459:デフォルトの名無しさん
05/03/23 07:53:51
素朴な疑問だが、lazyな言語で割り込み処理(シグナル等)はどうやって書くのだろう。
割り込み時の状態はどう定義されるのだろうか。


460:デフォルトの名無しさん
05/03/28 13:39:35
>>459
もれも良く分からんが、MIT pressから出てるSICPっていう本読んでると
無限ストリームっていうのが出てくるから、それ使うんじゃない?
A Gentle Introduction to Haskellっていう、Haskellの紹介文書
にも無限ストリームを使ったクライアントーサーバー処理の例が出てくるよ。


461:デフォルトの名無しさん
05/03/28 15:15:52
数学理論に立脚した言語で現実世界を対象としたプログラミングを行うことは間違いだ

462:デフォルトの名無しさん
05/03/28 15:16:30
>>461
はい?もう一度言ってもらえますか?よく見えなかったので。

463:デフォルトの名無しさん
05/03/28 18:39:05
>>459
たぶんlazyな言語に対して割り込みのformal semanticsを与えた人はいないと思う。
もの凄く難しい。

>>460
それは単なる入出力ではなかろうか。

464:デフォルトの名無しさん
05/03/28 20:05:44
イベントや割り込みであろうが入出力には違いないだろ
辻褄が合ってればいい

465:デフォルトの名無しさん
05/03/28 20:08:30
割込みは「単なる」入出力とは違うってことだろ

466:デフォルトの名無しさん
05/03/28 23:35:57
ghcでバイナリデータをバイト単位で扱うときって、Word8を使えばいいの?

Charだと数値との比較ができなくて不便。

467:デフォルトの名無しさん
05/03/29 01:36:32
MacOS X 10.3 で Haskell を使うのにお勧めの方法は何でしょうか?
Hugs98 か ghc になると思うのですが。 fink には入っているのは
どちらも Hugs98 2001-Feb と ghc 6.2 で少々古かったです。

468:デフォルトの名無しさん
05/03/29 02:58:49
Mac使うのを止めるのがオススメ!

469:デフォルトの名無しさん
05/03/29 04:16:23
そうだね。
爪弾きにされ、余計な苦労ばかり増えて良いところなんて一つもないし。


470:デフォルトの名無しさん
05/03/29 08:45:40
finkに頼らんでもHugsなら自分でmakeすればOKだし
GHCは本家にバイナリが用意してある

471:デフォルトの名無しさん
05/03/30 02:58:36
マイナー言語やる上で Mac は悪くないプラットフォームなんだけどね。
ML も主要なのは殆ど対応しているし。

472:デフォルトの名無しさん
05/03/30 03:06:14
haskellよりもMLの方が文法綺麗じゃないですか??そんなことないかな…

473:デフォルトの名無しさん
05/03/30 03:15:35
ML、特にSMLはDefinitionが出て以来そのままだからなあ(97年に改訂されたけど)。
Haskellの方も一応98はあるけど、そうじゃない部分は随時面白い話があるたびに
手を入れてきた感じなのは否めないのかも。


474:デフォルトの名無しさん
05/03/31 19:07:35
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)

この 2 冊が欲しいのですが、中を確かめてから欲しいので
都内で在庫がある店知りませんか?
東京駅~秋葉原~神保町あたりだと助かります。


475:デフォルトの名無しさん
05/03/31 22:26:11
グランデに電話してみれば?


476:デフォルトの名無しさん
05/03/31 22:33:33
> 474
Haskell: The Craft of Functional Programmingはかなりおすすめです。
買って損はないと思います。

477:474
皇紀2665/04/01(金) 10:58:40
結局 Amazon で注文しました。

URLリンク(www.hatena.ne.jp)
ここに載っててありそうなところには電話かけましたが
店頭に在庫はないみたいでした。Amazon がない時代は
みんなどうしていたんだろう…。大学生協で取り寄せかな。

478:デフォルトの名無しさん
皇紀2665/04/01(金) 18:28:57
>>474
神田行けばいくらでもあるだろ。
デカイ本屋で在庫あるか訊いてみろ。

479:474
皇紀2665/04/01(金) 19:57:19
>>478
私には >>477 以外に出てくる本屋以外にデカイ本屋は知りません。
おすすめのコンピュータの洋書をあつかっている店の名前が分かる
なら教えてください。

480:デフォルトの名無しさん
int 2ch =05/04/01(金) 20:48:22
>>479
URLリンク(www.book-kanda.or.jp)
URLリンク(www.book-kanda.or.jp)


481:474
int 2ch =05/04/01(金) 21:56:48
明日、神田を周ってこようと思います。
ありがとうございました。


482:デフォルトの名無しさん
int 2ch =05/04/02(土) 12:12:07
>>474
君見て自分も思い出したように買ったよ
まあ回っても見つからないと思うよ

483:474
05/04/03 11:46:47
昨日行ってきました。
水道橋駅を降りて、神保町駅まで歩きその周辺の本屋を巡りました。
コンピュータの洋書を扱っているのが、三省堂の本店しか見つける
ことができませんでした。在庫はあらず。

いくらでもあるとのことなのですが、探しかたが悪いのか、
>>482 さんの言う通りなのか不明です。

Amazon から Haskell: The Craft of Functional Programming
は届いたので読みすすめてます。結構面白いです。

484:デフォルトの名無しさん
05/04/04 04:15:17
>>483
> コンピュータの洋書を扱っているのが、三省堂の本店しか見つける
> ことができませんでした。

え、マジ? それは探し方が悪いのでは。


485:474
05/04/06 17:39:21
そうですよね。もっと探検してみます。

486:デフォルトの名無しさん
05/04/07 12:56:04
オレも他にはゆうりんどう(字わからん)くらいしか思いつかない。いいとこあるなら教えてcray。

487:デフォルトの名無しさん
05/04/07 14:51:05
洋書なんて読むなよこの非国民が

488:デフォルトの名無しさん
05/04/07 15:41:08
英語も読めないの?国辱。

489:デフォルトの名無しさん
05/04/07 20:21:03
洋書 = 英語書かよ、この拝米主義者め

490:デフォルトの名無しさん
05/04/07 20:31:05
英語=拝米の方がよっぽど(ry

491:デフォルトの名無しさん
05/04/07 20:48:29
Haskell: The Craft of Functional Programming は英語だろ?
国辱どもが。

492:デフォルトの名無しさん
05/04/07 20:57:10
当たり前のことを言うな一知半解野郎

493:デフォルトの名無しさん
05/04/07 21:30:11
これがゆとり教育の弊害か。確かに国辱。

494:デフォルトの名無しさん
05/04/07 22:14:10
>>487-493
レベルの低い話は止めろ

495:デフォルトの名無しさん
05/04/08 22:34:40
科学とかに関しては日本なんてどうでもいい罠。


496:デフォルトの名無しさん
05/04/09 09:19:13
Haskellの勉強してると類(kind)という言葉が出てくる。
手持ちの関数型言語の参考書では見かけないので、類を扱うのは比較的
珍しいことなのかと思うのだけれど、どう?
なんでHaskellには類が必要なの?

497:デフォルトの名無しさん
05/04/09 13:07:49
Haskellだと、普通の多相型([]とかMaybeとか)に加えて
「型構築子から型構築子への写像」(StateTとか)のようなものを定義できるから、
単に「無引数の型構築子」だとか「1引数の型構築子」とかいうだけじゃ不十分だからだと思う。

まあ、似たような機能のあるC++では「類」なんて聞いたこともないんだけど。
関数型言語についてはよく知らんので誰かフォローよろしく。

498:デフォルトの名無しさん
05/04/09 13:52:32
WinXPで動くHaskellのコンパイラってある?

499:デフォルトの名無しさん
05/04/09 13:59:36
>>498
え?GHCがwindowsで動くでしょ???

500:デフォルトの名無しさん
05/04/09 14:23:03
           ∩ノ
          / つ
         / /  / ̄ ̄ ̄ ̄
      ∧ ∧/   < 500ゲットぉぉぉぉ!
     ⊂(゚Д゚ ) 彡   \
        ⊂彡       ̄ ̄ ̄ ̄
   ____●●●___ バイーン
 / 〇 〇 \|/  /|
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄|

501:デフォルトの名無しさん
05/04/09 17:40:30
498ではないが、
WINXP sp2 で GHC のインストーラはエラーで落ちました。
hugs98 は簡単にインストールできました。

502:デフォルトの名無しさん
05/04/10 11:03:22
言語仕様を見るとHaskellの方がはるかに機能的に見えるのだけど、実用面を見るとHaskellはボロボロ。
結局、開発するならOCamlに軍配があがるんだよね。

503:デフォルトの名無しさん
05/04/10 11:31:38
だから品質には期待するなとあれほど(ry

504:デフォルトの名無しさん
05/04/10 13:23:42
だからghcにバグはないとあれほど(ry

505:デフォルトの名無しさん
05/04/11 11:57:34
>>497
Haskellよく知らんけど、合ってるんじゃん?
C++のテンプレートは展開してからチェックするので、いらないんでしょ。たぶん。

506:デフォルトの名無しさん
05/04/11 12:08:44
>>463
>たぶんlazyな言語に対して割り込みのformal semanticsを与えた人はいないと思う。
>もの凄く難しい

Haskellよく知らんので何か勘違いしてるかもしれんが、

URLリンク(research.microsoft.com)

のA semantics for imprecise exceptionsの5.1節とか
Imprecise Exceptions, Co-Inductivelyは違うの?


507:デフォルトの名無しさん
05/04/11 20:32:57
Haskellで正規表現は標準でサポートされているのですか?

508:デフォルトの名無しさん
05/04/11 20:44:09
>>507
URLリンク(www.google.co.jp)

509:デフォルトの名無しさん
05/04/15 17:30:13
>>501
3月21日位にインストーラーが変わっている様なのですが、それでインストールしても
駄目ですか?
当方はXP SP2でインストールできています。


510:デフォルトの名無しさん
05/04/15 19:37:33
つーかインストーラーぐらいちゃんと作れませんか?

511:501
05/04/16 12:07:17
>>509
最新版でインストールもできましたし、ちゃんと動きました。
ありがとうございます。


512:デフォルトの名無しさん
05/04/17 22:00:14
imprecise exception 云々よりどっちかというと Asynchronous exceptions in Haskell の方が該当する希ガス。

513:デフォルトの名無しさん
05/04/17 22:05:22
この言語扱うのに数学の知識必須みたいだな。初めて使ったが…

514:デフォルトの名無しさん
05/04/17 22:19:40
そうなの?どの辺でそう感じた?

515:デフォルトの名無しさん
05/04/17 22:33:46
>>514
いや、大したことじゃないんだけど、集合論とか。

516:デフォルトの名無しさん
05/04/18 01:09:42
文系お断り言語

517:デフォルトの名無しさん
05/04/18 11:59:50
Text.Regex は入力を不必要に最後まで読んでくれたりして微妙に嬉しくないんだよなあ。

518:デフォルトの名無しさん
05/04/18 23:56:27
で、この言語なんて読むんだ?
はすくぇる?

519:デフォルトの名無しさん
05/04/18 23:57:21
ハスケルカリー

520:デフォルトの名無しさん
05/04/20 23:24:41
GHCのコンパイルがなかなか終わらない。

ひょっとして、マシンパワーがかなり必要なの?
普段使っているのはおんぼろラップトップなんだよね。

521:デフォルトの名無しさん
05/04/20 23:45:27
>>520
こちとら、PowerBookG4(867MHz,RAM640MB)で
2ステージ+testsuite が6~8時間。

522:520
05/04/21 08:32:54
朝起きたら無事終わってた
GHCは普通のコンパイラとは内部構造がかなり違うようですな。

523:デフォルトの名無しさん
05/04/22 20:52:35
某スレでハスケルでGUIは辛いと言われてしまいました。
誰か反論の文句をおねがいします。

524:デフォルトの名無しさん
05/04/22 20:54:26
だからあれほどHaskellは実用アプリケーション作成向きでは無いと(小一時間

525:デフォルトの名無しさん
05/04/22 21:08:24
だからあれほどghcは完璧だと(ry

526:デフォルトの名無しさん
05/04/23 05:07:16
情処の記事を読んで触ってみた。


527:デフォルトの名無しさん
05/04/23 13:52:46
今月からFPの連載だね。

528:デフォルトの名無しさん
05/04/23 23:02:55
FP ってなんですか?

529:デフォルトの名無しさん
05/04/24 00:06:54
一時期流行った自分視点のゲームだろ

530:デフォルトの名無しさん
05/04/24 13:13:48
そりゃFPSだ。

動的計画法のことだろ?

531:デフォルトの名無しさん
05/04/24 18:54:43
Functional Programmingのことかと思った。

532:デフォルトの名無しさん
05/04/24 21:37:20
> 動的計画法のことだろ?
それはDP(dynamic programming)

533:デフォルトの名無しさん
05/04/24 23:26:26
わかりにくいネタでごめん

534:デフォルトの名無しさん
05/04/25 20:31:20
まじでどこで連載してるのか教えてくれ

535:デフォルトの名無しさん
05/04/25 20:56:53
情報処理学会誌ですね。
久しぶりにビニールを開けてみました。
相変わらず読むところが少ない…。

536:デフォルトの名無しさん
05/04/27 11:28:18
辛ければヨーグルトを使う

537:デフォルトの名無しさん
05/04/29 15:38:56
GHCがpanicっていってコンパイル止まったよ。
間違ったソースの中には対応しきれないものがあるようだ。

538:デフォルトの名無しさん
05/04/29 16:42:43
>>537
嘘はいけない。ghcにバグはない。

539:デフォルトの名無しさん
05/04/29 16:49:25
ghc のバグじゃなくてコンパイルするソース側の

540:デフォルトの名無しさん
05/04/29 16:57:37
>嘘はいけない。ghcにバグはない。

なんか凄い事聞いた気がする。
ほんと?

541:デフォルトの名無しさん
05/04/29 18:00:14
ほんとにそうならghcのwebにバグレポートのリンクがあったりしないべ。


542:デフォルトの名無しさん
05/04/29 18:49:30
Financial Planner

543:537
05/04/29 21:25:14
ほんとだよ。GHC cannot process input file. please report this to us とか出たもの。
もちろんソースは正しくないやつなんだが、それでもコンパイラが適切なエラーメッセージを
出せずに止まったことは事実。

544:デフォルトの名無しさん
05/04/29 22:13:13
ああ、拡張機能や新機能を使うと稀に起こるよ、panic。
ちゃんと報告してあげて下さい。

545:デフォルトの名無しさん
05/04/30 18:45:06
例のHaskell連載って公開してるんだね
URLリンク(www.ipsj.or.jp)

546:デフォルトの名無しさん
05/04/30 19:44:34
ハスケル!ハスケル!

547:デフォルトの名無しさん
05/04/30 21:27:04
    _  ∩
  ( ゚∀゚)彡
  (  ⊂彡
   |   | 
   し ⌒J

548:デフォルトの名無しさん
05/05/01 20:14:08
LISP Macro みたいなことできますか?
-- dotimes :: n -> (n -> IO()) -> IO()
dotimes n f = __dotimes 0
where __dotimes i | i >= n = return ()
| otherwise = do (f i)
__dotimes (i + 1)
-- dotimes 10 ( \x -> putStr (show x))
こんなもの?

549:デフォルトの名無しさん
05/05/01 23:02:28
遅延評価だし、アクションが第一級の対象だから、
全ての関数がマクロであるようなものじゃないか?

550:549
05/05/01 23:05:09
なんかピントの外れたことを言ったな。
誰かフォローよろしく。

551:デフォルトの名無しさん
05/05/01 23:19:07
dotimes' n f = sequence_ [ f n' | n' <- [0..n-1] ]
main = dotimes' 10 (putStr.show)


552:無理です。
05/05/01 23:20:58
例えばhaskellのif

if p then c else a
は、

case p of
 True -> c
 False -> a

の構文糖衣とみなせる。逆でもよい。
マクロの代わりになるかどうかは、自分のifをcaseで定義できるかどうかを
考えてみればわかる。

myif

mycase

さあどうぞ。


553:デフォルトの名無しさん
05/05/01 23:29:12
myif :: Bool -> a -> a -> a
myif p c a = case p of True -> c; False -> a

でいいんじゃないのか?

554:デフォルトの名無しさん
05/05/01 23:37:45
>>553
thenとかelseはどこいった?

555:デフォルトの名無しさん
05/05/01 23:43:22
シンタックスを定義できなてもマクロと言えると思うが。

556:デフォルトの名無しさん
05/05/01 23:49:16
↑それで消費者が納得すると思ってんのか?

557:デフォルトの名無しさん
05/05/01 23:52:37
>>555
関数マクロと言うべきか。


>>548の回答としては、

Q.LISP Macro みたいなことできますか?
A.できません。


558:デフォルトの名無しさん
05/05/02 00:05:54
haskellでは
a `lambda` (a + 1)
の様な表現ができないのが本質的っぽいね。

559:デフォルトの名無しさん
05/05/02 00:11:04
つまり、遅延であろうがなかろうが、LISPのようなマクロを書けるかどうかは
引数評価を自分でコントロールできるかどうかにある。
少なくともLISPのマクロ内に出てくるシンボルみたく、引数の一部を
評価せずにキーワードそのものとして扱うみたいな仕組みがないと。

560:デフォルトの名無しさん
05/05/02 00:25:50
「遅延評価」の意味で「評価」と言うと意味が違うと思う。
引数の評価をコントロールするだけならhaskellでもできる。
「解釈」と言えばいいのかな?

561:デフォルトの名無しさん
05/05/02 00:39:06
LISPのマクロはdefineを含むコードを生成できるけど、Haskellではそのような真似はできないはず。


562:デフォルトの名無しさん
05/05/02 13:13:17
HaXmlで下のinputからoutputのような出力を得たいんですがどのようにすれば
良いでしょうか?

---input---
<function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'>
<description>
similar to <f>delete</f>, but it allows the programmers to supply
their own equality test
</description>

---output---
["deleteBy", "similar to delete, but it allows the programmers to supply
their own equality test"]


<description>の中の<f>の処理がうまく行かず下のような結果になってしまい
ます。<description>の中のテキスト部分だけを抜き出したいです。別リスト
にしないで1つの文字列として。

["deleteBy", "similar to ", "delete", ", but it allows the programmers to supply
their own equality test"]


563:562
05/05/02 13:22:01
コードとサンプルデータを載せます。

import System.IO
import System.Environment
import Text.XML.HaXml
import Text.XML.HaXml.Pretty (content)

main :: IO ()
main =
do ~[arg] <- getArgs
h <- openFile arg ReadMode
str <- hGetContents h
case xmlParse "list.xml" str of
(Document _ _ (Elem _ _ contents))
-> mapM_ print $ map getCont contents

getCont = map content . contFilter

contFilter :: CFilter
contFilter = f `o` (tag "function")

f = cat [ ("name"?) , multi txt `o` (keep /> tag "description") ]


564:562
05/05/02 13:22:59
<module name="List">

<function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'>
<description>
similar to <f>delete</f>, but it allows the programmers to supply their own equality test
</description>
<example>
<in>deleteBy (\x y -> y `mod` x == 0) 4 [6,8,10,12]</in>
<out>[6,10,12]</out>
</example>
</function>

</module>


565:デフォルトの名無しさん
05/05/17 14:30:17
今月の文章は先月の和田先生のよりわかりにくいなあ。
例題をどう解くかの説明が全くなくて、説明もHaskellの説明にはなってるけど
例題のプログラムの説明としてはかなり端折られてるのが原因かな。




566:デフォルトの名無しさん
05/05/17 22:34:11
バイナリファイルを弄りたいんですけど
Haskellでビット演算の関数とか演算子とか
あれば教えてください。

567:デフォルトの名無しさん
05/05/17 23:38:07
:browse Bits

568:デフォルトの名無しさん
05/05/18 22:14:20
>>567
ありがとうっす

569:デフォルトの名無しさん
05/05/20 23:02:42
モナドって全然わかない

570:デフォルトの名無しさん
05/05/20 23:16:00
↑日本語もわかない人

571:デフォルトの名無しさん
05/05/21 01:33:08
最近自分は悟った。

モノイドとか圏論とかの背景思想を無視して
使う立場だけからいうと
モナドは数珠繋ぎ強制ギプスみたいなものだと。

(IO Char)とか(IO Int)とかの型は
CharやIntの値がくるまれたカプセルみたいなもんだ。
ちなみにIO ()の()はCでいうvoid型
return xx とやると普通の値もIOモナドで包むことができる。

572:デフォルトの名無しさん
05/05/21 01:33:49
ただしIOモナドは一度くるんだら中身を取り出す方法がない。
IO型の関数を普通の関数と組み合わせても型違いで
コンパイルエラーになる。
(IO ()ももちろん型違いでエラー)

そこでモナドの中身の値を
橋渡しするアダプタ(>>=)を使う。

結局>>=や>>で(IO xxx)型の関数同士やreturn xxで
数珠繋ぎにするしかないように強制される。

573:デフォルトの名無しさん
05/05/21 01:42:17
そいつは面倒だあ

574:デフォルトの名無しさん
05/05/21 01:43:08
IOモナドってGPLみたいだなとか思った。

575:デフォルトの名無しさん
05/05/21 01:48:49
数珠つなぎのしくみや値を包みこむ性質を利用して
他にもいろいろなモナドがあるし自分でも作れる(かもしれない)

Stateモナドは数珠繋ぎを利用して
IOモナドみたいな状態遷移を自分で作れる。

Maybeモナドは値を包むほうが主眼のモナド
実際の値の代わりにNothingというダミーを
突っ込んでおくことができる。
データベースのNULL値みたいに使える。

576:デフォルトの名無しさん
05/05/21 01:57:53
モナドと聞くと王監督の顔が思い浮かぶのは何故?

577:デフォルトの名無しさん
05/05/21 02:24:06
>>571
>CharやIntの値がくるまれたカプセルみたいなもんだ。
俺にはこの表現がなじまない。
カプセルってのは中身が取り出せてこそのものだよな。
だから、「CharやIntにに関係する何か」くらいの認識しかできない。

578:デフォルトの名無しさん
05/05/21 12:13:59
自分でIO型の関数作れば
前のIO関数から>>=で渡された
中身の生の値をちゃんと自由に扱える。

「取り出す方法が無い」んじゃなくて
「>>=を使って(間接的に)取り出すしか方法が無い」が
正しいかも。

579:デフォルトの名無しさん
05/05/21 12:15:56
monadic I/Oの意味論を破壊して喜ぶって、マゾですか?

580:デフォルトの名無しさん
05/05/21 12:16:44
そーゆーのには、
C言語とアセンブラがお勧め(w


581:デフォルトの名無しさん
05/05/21 12:30:25
>576
ワロス
俺も思いついた

582:デフォルトの名無しさん
05/05/21 16:33:47
もな~ももなど?

583:デフォルトの名無しさん
05/05/21 20:30:44
>>549
そのとおりだよね。

584:デフォルトの名無しさん
05/05/21 20:44:49
>>583
だからー、
その件はLISPマクロのようには書けないって話だろーが

585:デフォルトの名無しさん
05/05/21 21:04:10
>>559
名前渡し?遅延評価ってそういうことなのでは?

586:デフォルトの名無しさん
05/05/21 21:12:59
名前をキーワードとして扱う?CLtL4の仕様ですか?w

587:566
05/05/21 21:23:20
某バイナリファイルのヘッダ構造体の読み込み関数が
だいたい目処がたってきますた。

ところでdata宣言で作った構造体?にたいする
Javaのシリアライズみたいな仕組みやライブラリって
Haskellにはないんすかね?
リフレクションみたいな仕組みがないと無理?

ファイルフォーマットをリストで与えて結果もリストで返すみたいなのは
できそうだけどそれじゃせっかくの強力な型システムが活かせないような、、

588:デフォルトの名無しさん
05/05/21 21:25:51
>>585
あ、違うか
名前渡してないもんね
普通の意味の値の他に名前も値にできるようでないと圏論的には不完全なようなキガス

589:デフォルトの名無しさん
05/05/21 21:28:21
とゆーことは変数のポインタでいいのかどうか

590:デフォルトの名無しさん
05/05/21 21:39:32
>圏論的には不完全

というと?

591:デフォルトの名無しさん
05/05/22 16:51:02
ちょっと質問です。

二項関係 r の反射的・対称的・推移的閉包に (x,y) が属するかどうかを判定する関数
inEqvCl ってのを書いてみたんですけど、もうちょっとすっきりした書き方とかないでしょうか?

inEqvCl :: Eq a => (a,a) -> [(a,a)] -> Bool
inEqvCl _ [] = False
inEqvCl (x,y) s = chk s y x
 where
  chk lst v u | v == u = True
        | v `elem` ux = True
        | otherwise = or $ map (chk lst' v) ux
   where
    lst' = [ p | p <- lst, u /= fst p, u /= snd p ]
    ux = do p <- lst
        if u == fst p && u /= snd p
          then return $ snd p
          else if u == snd p && u /= fst p
            then return $ fst p
            else fail ""

実行例
(2,1) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)]
=> True
(1,6) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)]
=> False


592:デフォルトの名無しさん
05/05/22 21:57:54
>>591
こんなのでどうかな。
題意を理解していないので間違ってたらスマソ
import List

inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool
inEqvCl _ [] = False
inEqvCl (x, y) s
  | x == y = True
  | y `elem` ns = True
  | otherwise = any con ns
  where
    ns = map snd $ filter ((==x) . fst)  exts
    exts = s ++ map (uncurry $ flip (,)) s
    con n = inEqvCl (n, y) (s\\[(x, n), (n, x)])

593:デフォルトの名無しさん
05/05/22 22:23:13
面白そうなのでオレもやってみた。

-- 同値類のリストを算出
classify :: Eq a => (a, a) -> [[a]] -> [[a]]
classify (x, y) [] = [[x, y]]
classify (x, y) (c : cs)
| x `elem` c = (y : c) : cs
| y `elem` c = (x : c) : cs
| otherwise = c : classify (x, y) cs

inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool
inEqvCl (x, y) lis = (not . null) (filter (f x y) (foldr classify [] lis))
where f x y c = x `elem` c && y `elem` c

いろいろ最適化の余地があるが。

594:デフォルトの名無しさん
05/05/22 22:32:57
あ、>>593 間違ってるわ。これだと [(3, 4), (1, 3), (2, 4)] とかで
うまくいかない。

595:591
05/05/22 22:42:11
>>592-594

ありがとうございます。
やっぱり短く書けるんですね。

596:デフォルトの名無しさん
05/05/23 22:10:44
無限のリストだと止まらなくなるかな

597:シミュレーション板GPスレから来ました
05/05/24 01:12:59
PolyGP: A Polymorphic Genetic Programming System in Haskell
↑のプログラムソース PolyGP.tar って、uclのサイトから消えている様ですが、
どこかにバックアップないでしょうか?
よろしく、おながいします。

598:591
05/05/24 05:44:25
とりあえず問題が2つありました。

1. 反射的閉包なんで、inEqvCl (x,x) [] == Trueにならないといけない。

>>592さんのからinEqvCl _ [] = Falseを取り除けばOK。

2. (\\)は最初の1つしか取り除かないので、最初の集合に対称なものがあると拙い。

(\\)の代わりに下の(//)を使って対処。

(//) :: Eq a => [a] -> [a] -> [a]
xs // ys = [ x | x <- xs, x `notElem` ys ]


>>596
無限リストは今回は対象外なので問題ないです。(^^;

599:デフォルトの名無しさん
05/05/27 00:42:11
Haskellの配列の更新(//)は一部変更でも配列全部作り直したり
してるんですか?
リングバッファとかに使っても大丈夫ですか?

600:デフォルトの名無しさん
05/05/27 01:42:54
600

601:599
05/05/27 22:02:30
>>599
自己レス
URLリンク(d.hatena.ne.jp)
ここみるとだめっぽい感じでした

GCが仕事してくれること期待して
配列ガシガシ使い捨てにでもするか

602:デフォルトの名無しさん
05/05/27 22:21:03
いつまでたっても関数型のボトルネックだな>配列・構造体
これが解決しない限り関数型が栄えることは無い

603:デフォルトの名無しさん
05/05/27 22:21:57
俺達でwadlerを唸らせる解を考えよう

604:デフォルトの名無しさん
05/05/28 01:00:55
配列も、マクロな視点で見ればただの変数に変わりない
だから、修正された瞬間複製するのが妥当な戦略だろう
しかし、オリジナルが参照されないとわかっているなら複製する必要ないから複製を省略する。
ここまで考えてふと思いついた。
すなわち差分をもっとけばいいんじゃないかと。
配列n番目更新しますた!更新しますた!という情報を各インデクス毎に持っとくわけよ
配列を全て更新しおわたとしても、またさらに更新するかもしれない
その場合はまたその差分を作るわけよ
するとどうだい?
差分として分解された各配列の要素はまるでりすt(ry

おれには難しすぎたようだ!

605:デフォルトの名無しさん
05/05/28 01:13:09
>>602
Uniqueness Typing

606:デフォルトの名無しさん
05/05/28 05:03:54
配列や構造体もモナドにしたら?

607:デフォルトの名無しさん
05/05/28 08:38:44
starray とかいうモナドがあると聞いたが
漏れは調べてないので諸君調べて報告してくれ

608:デフォルトの名無しさん
05/05/28 11:15:19
マクド


609:デフォルトの名無しさん
05/05/28 13:50:31
>>606
つIOUArray

610:デフォルトの名無しさん
05/05/28 14:11:18
伝説のモナド

611:デフォルトの名無しさん
05/05/28 14:23:54
ナボナ@亀屋万年堂
URLリンク(www.navona.co.jp)

これのことでしょ?

612:デフォルトの名無しさん
05/05/28 20:20:45
>>607
それはスタレイました

613:デフォルトの名無しさん
05/05/28 20:52:42
>>28で紹介されているURLリンク(rrr.jin.gr.jp)のRWikiがNot Foundで見れません。

どうしたらよかとですか?

614:613
05/05/28 20:54:47
自己解決しました。
://pub.cozmixng.org/~the-rwiki/rw-cgi.rb にありました。


615:デフォルトの名無しさん
05/05/30 20:59:12
ハスケルを勉強したい時にはどうしたらいいですか?
日本語の丁寧なチュートリアル文献がありますか?
>>1のは難しいですよ

616:デフォルトの名無しさん
05/05/30 21:15:20
>>615
1. haskellで適当なコードを書く
2. -ddump-realCをつけてコンパイル
3. 1と2の結果を見比べる

617:デフォルトの名無しさん
05/05/30 21:46:39
>>615
URLリンク(www.geocities.jp)
とか。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch