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


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

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



1 名前:デフォルトの名無しさん [04/02/10 22:16]
Haskellの公式HP
www.haskell.org/
日本語サイト
www.sampou.org/cgi-bin/haskell.cgi
www.teu.ac.jp/kougi/koshida/Prog6/index.html

過去ログ、関連スレは>>2-5

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

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

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

ということでいいの?




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

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

ググッたらちょっと古い(1996)けどこんなのも
www-fp.dcs.st-and.ac.uk/~kh/papers/io-tutorial/section3_7.html
> 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 名前:デフォルトの名無しさん mailto:sage [04/10/16 22:26:55]
>>265
等しくはないね。
でもλ計算でいうところのnormal-order reductionをするわけでしょう?

267 名前:デフォルトの名無しさん mailto:sage [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【必読】
pc5.2ch.net/test/read.cgi/tech/1092932484/494-

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

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

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

>>269
ありがとう。

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





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

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

273 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/17 13:33:11]
「評価する」というのと「印字する」というのが微妙に混同されているような、いないような。

275 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/19 17:31:30]
宿題ですか?

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


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

281 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/19 18:42:26]
ここは優しいインターネッツですね

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


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

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

286 名前:デフォルトの名無しさん mailto:sage [04/10/19 21:39:10]
東京工科大じゃないの?
www.teu.ac.jp/kougi/koshida/Prog6/index.html
と思ったけど課題内容が違うから違うのかな。

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

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

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

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

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



292 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/20 19:25:08]
hFlush あたりを使うとよいのでは?

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

294 名前:292 mailto:sage [04/10/20 20:09:56]
>293

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

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

295 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [04/10/21 00:45:52]
>>297

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

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


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

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


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



302 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/24 20:58:48]
文字列は文字のリストで、リストはMonadクラスのインスタンスだから。
数値はMonadクラスのインスタンスではないから。

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


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

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

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

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


307 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [04/10/25 11:54:05]
>>310
こういう、Haskell風の思想を交えた解説は新参者にとって非常に参考になります。




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

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

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

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


313 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/27 17:58:07]
>>314
n が何なのか知らないが、pi は Float ではなくて?

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

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

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


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



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


323 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/10/27 23:10:08]
あーでもそれじゃnに整数以外の数つっこめちゃうのでだめか。



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

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


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

ありがとうございます。


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

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

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

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



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

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

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

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

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

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

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


339 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/11/23 11:56:51]
zip3' = (zipWith (uncurry (,,)) .) . zip

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

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


346 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:17:26]
>>346
大丈夫?

348 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:33:03]
Everyday Haskell
www.sampou.org/cgi-bin/haskell.cgi?Everyday&l=jp
が面白い


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

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

351 名前:デフォルトの名無しさん mailto:sage [04/12/27 23:20:33]
これ既出?
www.cin.ufpe.br/~haskell/vhs/



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

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

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

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

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


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

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

358 名前:デフォルトの名無しさん mailto:sage [05/01/23 14:46:59 ]
The Implementation of Functional Programming Languages オンライン復刻記念
ttp://research.microsoft.com/Users/simonpj/papers/slpj-book-1987/

って既出?

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



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

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



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

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

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

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






[ 続きを読む ] / [ 携帯版 ]

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

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