関数型プログラミング ..
[2ch|▼Menu]
655:デフォルトの名無しさん
05/06/10 17:09:38
649>>URLリンク(haskell.org)に簡単なつかいかたとかあるよ。がんばれ!

656:デフォルトの名無しさん
05/06/29 17:18:46
WinXPにHugsを導入したんですけど、読み込みまでは行くみたいなんですけど
実行してみると結果が表示されません。
例えば
myfactorial :: Int -> Int
myfactorial n
| n == 0 = 1
| otherwise = n * myfactorial (n-1)
というファイルを読み込んで
myfactorial 5
と入力しても何も結果が表示されずに
Main>
という状態に戻ってしまいます。何か原因があるのでしょうか。

657:¬656
05/06/29 22:55:14
XPでやってみたところ、GUIのやつ(WinHugs)が駄目なようです。
オプションあたりが怪しいけどサパーリ


658:デフォルトの名無しさん
05/07/04 22:20:14
ghcでControl.Monad.Readerをインポートすると
Monad ((->) r)のインスタンス宣言(中味はReaderと同じ)が
付いてくるっぽいんだが、いったいこれは何なんだ?
かなり便利だから積極的に使いたい気もするけど、
ドキュメントされてないみたいだし。

import Control.Monad.Reader

-- 3で割れて、かつ5で割れない自然数
t = filter (liftM2 (&&) ((==0) . (`mod`3)) ((/=0) . (`mod`5))) [0..]

659:デフォルトの名無しさん
05/07/04 23:50:56
Vital 使ってる人居ます?
URLリンク(www.cs.kent.ac.uk)

660:デフォルトの名無しさん
05/07/10 19:53:36
I/Oをマクロは解決しないか

661:デフォルトの名無しさん
05/07/11 23:39:29
FpLの抽象構文を拡張して、利用者定義関数が算術式と論理式とを混在してとることができるようにするにはどうすればよろしいですか?評価意味論を適当に拡張するらしいのですが・・・


662:デフォルトの名無しさん
05/07/11 23:40:00
名前呼びを用いると、ある式eに対してD,ρ├ e ⇒ A kとなる数字kが存在するけれども、値呼びを用いると、D,ρ├ e ⇒ A kとなる数字が存在しない宣言の例ってありますか?

663:デフォルトの名無しさん
05/07/12 07:34:27
まず元ねたを書け。話はそれから。

664:デフォルトの名無しさん
05/07/19 18:29:38
圏論の基礎 日本語訳 S.マックレーン
URLリンク(www.amazon.co.jp)

665:デフォルトの名無しさん
05/07/19 20:19:44
"Catefories for Working Mathematician" (働く数学屋のための圏論) の題名が
「圏論の基礎」になっちまうんだとしたら、

"Categories, Types, and Structures: An Introduction to Category Theory for the Working Computer Scientist (Foundations of Computing Series)"
の題名はどーなるんだ?
「一週間で判る!くもんしきけんろん (いちねんせいむけ)」か(笑



666:デフォルトの名無しさん
05/07/19 20:31:23
>>664
買っちゃった。

667:デフォルトの名無しさん
05/07/19 20:43:25
>>666
でどうよ?

>>665
"Basic Category Theory for Computer Scientists (Foundations of Computing)"
「圏論の超基礎」つうのもある・・・

668:デフォルトの名無しさん
05/07/19 20:47:40
"Categorical Logic and Type Theory (Studies in Logic and the Foundations of Mathematics)"
「論理&数学ラブ♥な人のための、カテゴリー・ロジックと型理論」
なんつう分厚い数学書も買うには買ったけど、これは完全に死蔵本だな、たぶん。

669:デフォルトの名無しさん
05/07/19 20:49:10
ってな意味で、いきなり訳書を読めるアンタ(>>666)、
幸せ者だぞゴラァ!!!

670:デフォルトの名無しさん
05/07/19 21:17:36
>>667
誤植が多いみたい。

671:デフォルトの名無しさん
05/07/19 22:24:11
誤訳じゃなくて誤植ってのが泣けるね。

672:デフォルトの名無しさん
05/07/19 23:39:47
「できる圏論」

673:デフォルトの名無しさん
05/07/19 23:40:57
モノイダル圏とか分からない件

674:デフォルトの名無しさん
05/07/21 16:22:11
URLリンク(www.sampou.org)
暇だからこれ読んでたんだが、ユーザ定義型のデータ構築子と型構築子の意味が分らん。
誰かなんかC,C++の似たような概念の用語で分りやすい説明キボンヌ。

675:デフォルトの名無しさん
05/07/21 18:51:43
データ構築子 <=> classのコンストラクタ
型構築子 <=> template

676:デフォルトの名無しさん
05/07/21 21:21:07
型構築子はtypedefでは?


677:デフォルトの名無しさん
05/07/21 21:34:50
typedef は多相(総称?)型の定義ができんでしょ。


678:デフォルトの名無しさん
05/07/21 23:42:00
CやC++でプリミティブと言われてる型は、Haskellでは全て列挙型
という見方をするの?

data Int = -65332 | ... | -1 | 0 | 1 | ... | 65332
という例が載ってるけど、こんな感じに、
新たに型を作る。作られる型がデータ構築子
そのときに型のデータのインスタンスを列挙する。列挙されるのがデータ構築子。

こんな感じでいいのかな?頭悪くてすいませんねw

679:デフォルトの名無しさん
05/07/21 23:43:28
×新たに型を作る。作られる型がデータ構築子
○新たに型を作る。作られる型が型構築子

680:デフォルトの名無しさん
05/07/21 23:52:20
しかし新たに型を定義する式のためのキーワードがdataで、
Cのtypedef風なものにtypeが使われてるのはなんかちょっと違和感あるというか。
typeはいいとして、なんでdataなの?

681:デフォルトの名無しさん
05/07/22 00:54:47
>>680
データ型宣言だから、では駄目かい?

682:デフォルトの名無しさん
05/07/22 08:43:46
>>681
厨房臭いんですが、dataってのは納得できないですね。
それはまあいいとして、このスレはちょっとレベルが違いすぎるので、
初心者はこっちで質問することにしました。どうもです。

関数型言語Part IV
スレリンク(tech板)

683:デフォルトの名無しさん
05/07/22 08:52:28
言語に特有の質問なんだから、このスレのほうがいいんじゃないか?

684:デフォルトの名無しさん
05/07/22 13:15:03
SMLはtype synonym宣言に'type'、データ型宣言に'datatype'を使う。
Haskellはそいつを参考にしたが、'datatype'は長いので'data'にした。
というのも考えられるかも。

685:デフォルトの名無しさん
05/07/22 13:45:51
OCamlなら全部typeで済ませられるぞ(逆に言うと宣言の見掛け上区別できない)。

686:デフォルトの名無しさん
05/07/27 20:28:46
Peyton Jonesの本が面白すぎて夜も眠れません。

687:デフォルトの名無しさん
05/07/28 01:59:51
HaskellからCleanに宗派変えてみる。

688:デフォルトの名無しさん
05/08/13 00:17:46
ここでは、こういうネタはスレ違い?
URLリンク(www.geocities.jp)

本家からもリンクされてる。
Monadius
A shoot 'em up game using OpenGL. Takayuki Muranushi also wrote a couple of other games in Haskell.
URLリンク(www.haskell.org)


689:デフォルトの名無しさん
05/08/26 17:04:35
_|_って何から来てるんですか?
数学?

690:デフォルトの名無しさん
05/08/26 18:12:56
>>689
うん

691:デフォルトの名無しさん
05/08/26 20:28:34
どの分野か教えてもらえますか?これも圏論?

692:デフォルトの名無しさん
05/09/06 17:46:57
越田先生@東京工科大のレジュメ URLリンク(www.teu.ac.jp)

ってのは、今はどこで見れるの?

693:デフォルトの名無しさん
05/09/06 18:33:49
URLリンク(www.teu.ac.jp)
もう読めないのかも。Internet archiveにはあるか?

694:デフォルトの名無しさん
05/09/06 19:48:40
>>693
亡くなられたのか……まだ若いのに。

プログラム工学VI 授業関連資料
URLリンク(web.archive.org)

695:デフォルトの名無しさん
05/09/07 00:28:33
>>693
うへー、マジカヨ。
ご冥福をお祈りいたします。

696:デフォルトの名無しさん
05/09/07 00:32:24
貴重な(ry

697:デフォルトの名無しさん
05/09/07 01:58:27
この人のチュートリアルをどこかにページにそのままうpしたらまずいのかな?
需要はかなりあると思うのだが。

698:デフォルトの名無しさん
05/09/07 14:24:35
それより誰かが成書に仕上げて印税が遺族に行くようにできるとよいな。

699:デフォルトの名無しさん
05/09/07 19:19:39
おいおい越田先生、死んだのかよ。面識なんてもちろんないけど
チュートリアル何度も読んでたから、泣けてくるじゃネーか
合掌(-人-)

700:デフォルトの名無しさん
05/09/13 02:08:53
>>693
ひさしぶりに覗いたら悲しい知らせが。
南無。 そしてありがとう。

701:デフォルトの名無しさん
05/09/15 09:54:51
URLリンク(mono.kmc.gr.jp)

702:デフォルトの名無しさん
05/09/16 03:51:24
Ruby 2.0 勝手に実装してくれよ

703:デフォルトの名無しさん
05/09/16 04:46:06
実装できるほどの仕様が決っていないのでは?


704:デフォルトの名無しさん
05/09/19 17:14:40
ここでPugsの話題が出ないのが謎
本家よりずっと先にリリースって、すげーと思わない?

705:デフォルトの名無しさん
05/09/21 02:03:18
すげー過疎

とりあえずVersion 6.4.1リリースage

706:デフォルトの名無しさん
05/09/24 00:34:03
引数のパターンマッチング
guard
if-then-else
case-of

って基本的には同じですか?

707:デフォルトの名無しさん
05/09/24 01:44:59
引数のパターンマッチングと case-of はほとんど同じと考えてよい。
if とパターンマッチは違う。

パターンマッチには真理値で条件を与えることができる。これはガード部とか
言われる。 guard がそのことを指して書いたのであれば、 if と似ていると
は言えるかもしれない。

guard 関数はぜんぜんまったく関係ない。


708:デフォルトの名無しさん
05/09/24 11:29:13
if b then t else f

case b of {
  True -> t;
  False -> f;
}
の省略記法。この意味では同じといえると思う。

709:デフォルトの名無しさん
05/09/24 16:38:46
その4つは束縛変数を導入できるかという点で区別することもできるね。

710:デフォルトの名無しさん
05/09/24 19:55:50
ここにいる奴って、普段何してるんだよ

haskellでオナニーできてるか?

711:デフォルトの名無しさん
05/09/24 21:19:20
昨日STGで2回…

712:デフォルトの名無しさん
05/09/24 23:20:51
monadタソ(;´Д`)ハァハァ

713:デフォルトの名無しさん
05/09/26 18:07:59
★〜彼方の願い星〜★
このレスを見た人は、超ラッキーな人♪
でも、このレスを見ただけじゃ何も起らないよ。
効果を実感したいなら、このレスを5回違うスレにレスしてね♪
だぁい好きなあの人に告られたり、
成績がどんどん良くな★〜彼方の願い星〜★
このレスを見た人は、超ラッキーな人♪
でも、このレスを見ただけじゃ何も起らないよ。
効果を実感したいなら、このレスを5回違うスレにレスしてね♪
だぁい好きなあの人に告られたり、
成績がどんどん良くなって、先生に褒められちゃったり...。
次々とHAPPYな事が訪れます♪
此の頃変なのがいっぱい回★〜彼方の願い星〜★
このレスを見た人は、超ラッキーな人♪
でも、このレスを見ただけじゃ何も起らないよ。
効果を実感したいなら、このレスを5回違うスレにレスしてね♪
だぁい好きなあの人に告られたり、
成績がどんどん良くなって、先生に褒められちゃったり...。
次々とHAPPYな事が訪れます♪
此の頃変なのがいっぱい回っ★〜彼方の願い星〜★
このレスを見た人は、超ラッキーな人♪
でも、このレスを見ただけじゃ何も起らないよ。
効果を実感したいなら、このレスを5回違うスレにレスしてね♪

これが本物の、初代HAPPYメールです♪ってますが、これは本当です!!
これが本物の、初代HAPPYメールです♪って、先生に褒められちゃったり...。
次々とHAPPYな事が訪れます♪
此の頃変なのがいっぱい回ってますが、これは本当です!!
これが本物の、初代HAPPYメールです♪

714:デフォルトの名無しさん
05/09/28 23:39:39
Emacsのハスケルモ〜ドって使いにくくないですか?
特にインデントが何回も叩かないと希望の位置にこない。


715:デフォルトの名無しさん
05/09/29 00:00:52
haskell-mode、出来はすごく良いと思うけど。
インデントはすくなくとも手で揃えるより楽だし、ローテートしてくれるのは良いよ。
関数定義も補完してくれるし。
ただcase 〜 of のインデント位置のポリシーだけは気にいらないな。あれは of の前で改行することを想定しているのだろうか。

716:デフォルトの名無しさん
05/09/29 00:29:05
そうですか。もうちょっと頑張って使い込んでみます。
あと、M-x turn-on-haskell-hugs して C-c C-l するとEmacsが固まって
C-g打つまで帰ってこなくなるんですが、何か設定が必要なのでしょうか?
Hugs.Base>
というプロンプトで一回 :load して、プロンプトが
Main>
になった後はすんなり動くんですが。

Emacsのバージョンは21.3です。


717:デフォルトの名無しさん
05/09/29 01:20:23
Haskell-modeは優秀だと思う。

718:デフォルトの名無しさん
05/09/29 01:40:00
>716
そういう症状は体験したことがないなあ。自分はおおむね
URLリンク(www.haskell.org)
のように設定している。
でも最近はもっぱら ghci で hugs を使ってませんねぇ。


719:デフォルトの名無しさん
05/09/29 12:16:49
716ですが原因を特定しました。

私の環境ではhugsを起動した直後のプロンプトは
Hugs.Base>
なのですが、huskell-hugs-start-processでcomint-prompt-regexpに設定する
パターンが"^\? \\|^[A-Z][_a-zA-Z0-9]*> "となっていて
ドットを含まないためのようです。これを修正すると問題は解消しました。
(せめてdefvarしていて欲しかった……)

hugsもhaskell-mode.elもFreeBSDのportsで入れたのですが、みなさんの
hugsではプロンプトは別の文字列なのでしょうか?


720:デフォルトの名無しさん
05/09/29 20:46:48
>719
少し前(200311_1)には
Prelude>
だったが、今は確かに
Hugs.Base>
になってるね。


721:デフォルトの名無しさん
05/09/29 22:28:13
Haskell 使おうっと思ってんだけど、サンプルプログラムがなきゃ分からん。

いきなり Pugs, Rtype, Monadius だと手ごわすぎるので、もうちょい下のレベルで、
おすすめを教えて頂戴。

ウェブアプリを作ることがほとんどなので、Wiki, Blog(Diary), BBS 辺りが理想なんだけど。

722:デフォルトの名無しさん
05/09/29 22:57:36
>>721
俺は特に何かをお薦めする程わかっちゃいないが、取り合えず
URLリンク(www.haskell.org)
を紹介しとく。

723:デフォルトの名無しさん
05/09/29 23:04:55
>>722
さんきゅ。

とりあえず、

Flippi: a Wiki clone written in Haskell
URLリンク(www.flippac.org)

でも見てみるよ。

724:デフォルトの名無しさん
05/09/30 11:39:06
「連載: Haskellプログラミング」のメモ化のところがよーわからん。
State s t、withState、bindStateのところで詰まってしまった。
誰か日本語でわかりやすく説明して!


725:デフォルトの名無しさん
05/09/30 17:42:10
Stateモナドの知識がないと難解だと思う。

type State s t = s -> (t, s)
というのは、現在の状態を受け取って新しい状態とさらに何かを返す関数。
だから、State s t型の値を「状態を変更してついでに値を生み出す仕掛け」と見ることができる。
ここで、「状態を変更せずに常に決められた値xを生み出す仕掛け」は

\state -> (x, state)

と書ける。これがwithState x。
一方、「起動されたとき仕掛けxと仕掛けyが順に起動されたかのように振る舞う仕掛けthenState x y」は
次のように定義できる。

thenState :: State s a -> State s b -> State s b
thenState x y = \s0 ->
  let (_, s1) = x s0 in -- xに初期状態s0を与えて起動、中間状態s1を得る。xによって生成された値は無視。
  y s1 -- yに中間状態s1を与えて起動、終状態と値の組を得る。これはそのまま合成されたしかけの戻り値となる。

thenStateではxによって生成された値を無視したが、この値に基づいて
次に何をするか決めることができないと面白くない。そこで、yとして単なる仕掛けではなく、
「xによって生成された値を受け取って仕掛けを返す関数」を渡すことにする。

bindState :: State s a -> (a -> State s b) -> State s b
bindState x y = \s0 ->
  let (result, s1) = x s0 in -- xを起動し…
  (y result) s1 -- …次に(y result)を起動

726:デフォルトの名無しさん
05/09/30 22:49:12
すごくわかりやすい! あなたとても賢いね。
どうもありがとうございました。

State s t を状態遷移図での状態aから状態bへの矢印とイメージしました。
withState x は、状態遷移図で状態aから同じ状態aへ戻る矢印(出力x)ですね。


727:デフォルトの名無しさん
05/10/01 11:13:33
Haskell はなかなか自分の思い通りにかけるようにならない orz

728:デフォルトの名無しさん
05/10/01 14:23:21
Cとかと違ってプログラマのほうに能力がないと何もできんよな……

729:デフォルトの名無しさん
05/10/01 20:48:54
Haskellで書くとバグがなくなると聞いたんですが本当ですか?

730:デフォルトの名無しさん
05/10/01 22:48:41
バグは出にくいが慣れないうちは普通にコンパイルを通すだけで苦労する。

731:デフォルトの名無しさん
05/10/01 23:21:49
>>729
俺も最初はランタイムエラーは絶対出ないものと思ってたけど
guardとかの場合わけ漏れとか
パターンマッチの不整合エラーがたまにある、、、

ぬるぽとかと比べて感覚的に頻度少ないけどね。

732:デフォルトの名無しさん
05/10/01 23:59:39
>>729
いいえ

733:デフォルトの名無しさん
05/10/02 00:42:37
整数をゼロで割ると実行時エラーになるし。

完全でないパターンマッチは、ghcなら警告を出させることもできるから、
あとはプログラマの問題という気がするが。


734:724
05/10/02 05:03:11
「連載: Haskellプログラミング」の9月号分を読んで
なんとなく理解したところでは
Haskellで評価の順序を強制するためにはCPSのように書くことが必要で、
Monadは継続に付加情報を(連続的にというか玉突き的にというか)持ち回る道具、
do構文はそれを手続き型のように書く構文、
というところだろうか?


735:デフォルトの名無しさん
05/10/02 08:35:39
Monadは全てを記号論的に処理する枠組み
doは状態遷移を隠蔽するモナド関数
で合ってる?


736:デフォルトの名無しさん
05/10/02 09:44:07
>>734
Stateモナドについてならその理解でいいと思う。
ただし、モナドの意味論は個々のモナドでかわる。モナドそのものは
「do記法で書くことのできるひとまとまりの計算の構成を支援するもの」くらいではないかな。
たとえばIOモナドは副作用が存在しうるような場合の計算の順序の保証する。
Maybeモナドは途中でNothingになるかもしれない計算のまとまりを構成する。
などなど。

あとは「モナドのすべて」を読むといいと思うよ。
URLリンク(www.sampou.org)


737:デフォルトの名無しさん
05/10/03 20:52:08
      /\
    /   \  今このとき,モナドは立ち上がる
   /∧_∧ \    
 /( ´∀`)  /\
 \(    ) /  \    
   \    /       \
    \/         \
          ∧∧∧∧\
         (  ´/) ))ヽ∧
         /   /  / ´∀) ∧∧
       ○(   イ○  (   ,つ, ,゚Д゚)  
       /ヽ  )) ヽ  )ヽ )と  , イ
       (_/(_/(_/(_/ノ(_/⊂ノ> )J
   / ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y

738:デフォルトの名無しさん
05/11/01 01:17:46
純粋関数型言語を業務で使ってみたい。

739:デフォルトの名無しさん
05/11/01 01:23:35
ぜひ使ってくれ

740:デフォルトの名無しさん
05/11/02 01:11:11
あなたの業務が研究・教育ならいくらでも…

741:デフォルトの名無しさん
05/11/03 10:35:10
hasktags って使える?
誰か、 GHCmacs でも作ってくえ。

742:デフォルトの名無しさん
05/11/12 10:24:33
行列をhaskellで実装する場合、単位元ってモナドで表現する?

743:デフォルトの名無しさん
05/11/12 19:00:45
連載 Hakellプログラミングの8月号にのってる
両替問題の最初でつまづいてしまいました。

cc ::Amount -> [Coin] -> Count
という関数を
a < 0でないとき
cc a (c:cs) = cc (a-c) (c:cs) + cc a cs
と定義してますが、なぜこれで指定した金額aの両替の組み合わせ個数になるんですか?

初歩的な質問で済みませんが教えてください。

744:デフォルトの名無しさん
05/11/12 19:11:23
>>743
貨幣cを一つ以上使う場合の数は、cを一つ使った後の両替を考えて、cc (a-c) (c:cs)
貨幣cを一つも使わない場合の数は、cc a cs
この和が求めるものになる。

745:デフォルトの名無しさん
05/11/12 19:30:54
>>744
なるほど。
うまく考えるものですね。
ありがとうございました。

746:デフォルトの名無しさん
05/11/12 20:31:08
簡単な例を作るといいよ
10円 を 5円 と 1円 で両替して樹形図を書く

747:デフォルトの名無しさん
05/11/12 21:27:57
高校でやったろ? 順列と組み合わせ。

748:デフォルトの名無しさん
05/11/12 21:38:52
>>747
お前がいまやってるんだろ?ww

749:デフォルトの名無しさん
05/11/13 02:16:56
母関数を使えば簡単に計算できるのに

750:デフォルトの名無しさん
05/11/13 09:14:43
>>748
今頃やってるとしたら遅すぎると思うんだが。
夏頃やってたような。昔の記憶だが。

751:デフォルトの名無しさん
05/11/13 22:17:02
>>749
母関数から特定の項を取り出す手間とボトムアップに解を構成する手間はいっしょ

752:デフォルトの名無しさん
05/11/14 06:49:45
>>751
母関数から特定の項を取り出すのは紙と鉛筆で簡単にできるでしょ。
わざわざプログラムなんて書く必要もない。


753:デフォルトの名無しさん
05/11/14 20:09:53
>>752
詳しく頼む。

俺は Polya の本にその母関数の一般項の計算には DP を使うと書いてあったので、無理だと思ってたんだが。

754:デフォルトの名無しさん
05/11/14 23:45:35
>>753
組み合わせ論の入門書やConcrete Mathに出てるようなんじゃだめなの?

755:752
05/11/15 00:16:35
>>754
Concrete Math の p.331 から 2 ページくらいで計算されてるやつ?

この例の最初のところに「一般の効果の場合に計算するのはとても難しい」とあるし,
その下で計算されてる {1, 5, 10, 25, 50} の特殊例においても「trick」と称される
計算をしないといけないし,さらに,最終結果に残ってる A_k は多項式を実際に展開しないと求まらない.

というわけで,これは一般性が無いという意味で >>744 が母函数から簡単に出るという
説明にはなってないし,特殊例を含めても >>752 の「簡単」ってのはどうかと思う.


コレじゃないならポインタください.

756:デフォルトの名無しさん
05/11/15 21:19:55
Haskellのデータ構築子が非正格なのは便利なんだけど、
一般の関数が非正格で嬉しいことってある?
デフォルトで正格でも良いような気がするんだが。

757:デフォルトの名無しさん
05/11/15 21:44:13
以下の二つが大きいそうだ
・相等性についての議論が楽になる(単純に置換するだけでOK).
・制御構造を自分で設計できる.
 cond p x y | p         = x
            | otherwise = y           
 recip x = cond (x == 0) 0 (1/x)
 は正格なら recip 0 = bot, 非正格なら recip 0 = 0.

758:デフォルトの名無しさん
05/11/15 22:37:48
>>757
反応ありがとう。

>・相等性についての議論が楽になる(単純に置換するだけでOK).
なるほど。気付かなかった。
でも、現状だとIntのaccumulator引数付きのちょっとした末尾再帰関数なんかを書くたびに
明示的に正格評価を指定しないとパフォーマンスに打撃があるわけで、
「議論が楽になる」って利点はこのコストに見合うんだろうか。

…などと思うのは俺が言語を使うだけの立場だからかな。

>・制御構造を自分で設計できる.
これはどちらかというと特殊なケースだから、非正格をデフォルトにする理由としては弱いと思う。

759:デフォルトの名無しさん
05/11/15 22:56:10
もともとは研究者の研究者による研究者のための言語だから、
コストパフォーマンスより性質を重視してるんじゃない?
ていうか、非正格の言語を統一する目的で作られた言語だしね。

正格がデフォルトの言語はMLを始めすでにいっぱいあるから
そっちを使ったらどうかな。

760:757
05/11/15 23:37:37
>>758
俺は前者も後者も重要と思ってるんだけどね。まあとりあえず前者について少し強く推しておく。

「three x = 3 」 と定義したときに、「 2 + three x == 5 」 が成立するかどうかを判定することを考える。
これを非正格に評価するとthree x を単純に 3 に置き換えて 2 + 3 == 5 にして、成立する、と結論が出るんだけど、
正格評価だと、x が絶対 bot にならないなら成立、そうでないなら不成立、というようにドメインまで考えないと駄目になる。

特に函数が複雑に組み合わさってる場合に、どこかで bot になる可能性があるとかそういうことを考えるのはしんどいし、
上の函数でもそうだけど、 bot 以外で成立、とかいうのは本質的に成立にしちゃったほうが有意なケースが多いんだわ。

761:デフォルトの名無しさん
05/11/16 00:02:49
相等性?(0.6 + 0.000000000000000041) == 0.6
浮動小数は代数的ではないとはいえ、言語的にこれでいいでしょうか?



762:デフォルトの名無しさん
05/11/16 11:02:44
>>756
バックトラックが、普通に全数探索するようなコードを書くだけで実装できてしまうとことか。

763:デフォルトの名無しさん
05/11/18 20:07:17
どうでもいいこと。

>>757
>  recip x = cond (x == 0) 0 (1/x)

(x == 0) ? 0 : (1/x)

ちゃんとしたコンパイラなら動くきがす。

764:デフォルトの名無しさん
05/11/19 22:59:06
え、だから?
煽りじゃなく本気で意味がわからん。


765:デフォルトの名無しさん
05/11/20 16:33:55
Hugs.Base> let n C r = product [n-r+1..n] `div` product [1..r] in 5 C 3
10

766:デフォルトの名無しさん
05/11/24 22:06:26
なんとなくtak関数を書いてみたらCより速くてびっくりした。
thunkの絡まない計算は速いんだな。

767:デフォルトの名無しさん
05/11/27 20:34:53
Cのコンパイラオプションは?

768:デフォルトの名無しさん
05/11/27 21:57:49
>>767
-O2。
言われて気づいたけど、-O2 -fomit-frame-pointerとしたらCの方が速かった。

769:デフォルトの名無しさん
05/11/27 22:44:24
haskellには実行速度を求めないで美しいライブラリを書いて欲しいんだよね。

770:デフォルトの名無しさん
05/11/27 22:51:32
Cとかと違って本質的な速度向上がありうるしね.
簡単な記述のほうがプログラム変換に持ち込みやすいし.

771:デフォルトの名無しさん
05/11/28 00:09:59
贅沢を言うが、美しいコードが速いコードにコンパイルされて欲しい。
fac n = product [1..n]が末尾再帰のfacと同等なコードにコンパイルされる日は
来るんだろうか…

772:デフォルトの名無しさん
05/11/28 01:39:57
つ Clean (速いコード)
import StdEnv, BigInt
factB :: Int -> BigInt
factB n = foldr (\x y =y *% x) one [1..n]
//factB n = foldr (%*) one [1..n] // %* がないから


773:デフォルトの名無しさん
05/11/28 06:03:30
>>771
product は foldl で書けてるわけだから,もう末尾再帰になってると思うが.

774:デフォルトの名無しさん
05/11/28 11:51:06
乗算が全部遅延されるから末尾再帰の意味があんまりない。

775:デフォルトの名無しさん
05/11/28 13:49:20
コンパイラが正格性解析して最適化するから問題無し。

776:デフォルトの名無しさん
05/11/28 20:37:04
>>772
多倍長演算に時間をとられる階乗は例が悪かったかも。
興味があったのは、リストを作って壊すオーバーヘッドをなくすような最適化。

>>773
ごめん。明示的な再帰で書かれたfacのことを言いたかった。
fac = iter 1 where iter a 1 = a; iter a n = iter (a*n) (n-1)

777:デフォルトの名無しさん
05/11/28 23:57:12
>>774
標準 Prelude では sum とか product の fold は積極評価のオペレータを
導入して実装されてるんじゃなかったっけ.

>>776
リストを作って壊しているとは限らない.というか普通はそんなことしてない.
product n = foldl (*) 1 (take n (enumFrom 1)) で定義したとき,
product n
= foldl (*) 1 (take n (enumFrom 1))
= foldl (*) 1 (take (n-1) (enumFrom 2))
= foldl (*) 2 (take (n-2) (enumFrom 3))
...
= foldl (*) n! (take 0 (enumFrom n))
= foldl (*) n! []
= n!
みたいに評価されるから,陽に空リスト以外のリストを作る部分は無い.

778:デフォルトの名無しさん
05/11/29 00:46:37
>777
少し前にメーリングリストで「sumはfoldl'を使うべき」という議論があったね。
いま見直したら、議論は「可算は常にstrictと言えるか」とかいう方向にシフトしちゃってたけど。
んで、型クラスを使っている以上、+演算子が常に strict に評価可能である保証はできないので、ということで議論は終結してしまっていた。
実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。

実際問題としては strict 版の sum' と product' が(Listにでも)用意されていればいいと思うんだけど。

ちなみに仕様上も、
URLリンク(www.sampou.org)
foldl を使うことになっているので、仕様が変わるまでは積極評価版にはならないと考えた方がいい気がする。


779:デフォルトの名無しさん
05/11/29 09:25:21
>>778
そかー…….

まあ product [-10000..1] とかを一回の乗算で終わらせられる可能性があるから
戦略上絶対に悪いというわけじゃないんだろうけど癪だなあ.

780:デフォルトの名無しさん
05/11/29 11:46:33
>>777
>リストを作って壊しているとは限らない.というか普通はそんなことしてない.
その過程は、細かく言うと(foldlの代わりにfoldl'を使って)
...
= foldl' (*) 1 (take (n-1) (enumFrom 2))
= foldl' (*) 1 (take (n-1) (2:enumFrom (2+1))
= foldl' (*) 1 (2:take (n-2) (enumFrom (2+1)))
= foldl' (*) 2 (take (n-2) (enumFrom (2+1)))
...
のように進むから、1ステップごとにconsを作っては壊す必要があると理解してたんだけど、違う?

>>778
>実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。
IntとIntegerについては正格な版が使われると明言されてる。
URLリンク(www.haskell.org)
といってもDoubleやWord32やRationalは遅延評価版だけど。

781:デフォルトの名無しさん
05/11/29 21:24:51
『ふつうの Haskell プログラミング』2005 年度内発売予定
URLリンク(i.loveruby.net)

782:デフォルトの名無しさん
05/11/29 23:27:32
>>781
ネ、ネタにしかみえねぇ……
マジなのか?

783:デフォルトの名無しさん
05/11/30 02:16:17
ふつうの人は、Haskellでプログラミングしない。

784:デフォルトの名無しさん
05/11/30 03:23:53
>>781
年内ではなく、年度内かよ。

ホントでたら買わせていただきます。
それよりも誰か The Craft of Functional Programming  を訳してください。英語で挫折してしまいました。

785:デフォルトの名無しさん
05/11/30 17:10:48
世界よ、ありがとう

786:デフォルトの名無しさん
05/12/06 08:44:52
出版も遅延評価で行なわれます。
宣言はされても評価はされません。

787:デフォルトの名無しさん
05/12/06 10:42:49
参照透明性の関係で版ごとにタイトルが違うか、IOモナドに包まれて出版されます。
後者の場合、読者もIOモナドに包まれないと読めません。

788:デフォルトの名無しさん
05/12/06 11:12:00
つまり必要が生じたときにその箇所だけ読まれるわけじゃなくて前から順番に読まれることが保証されているといいたいのか

789:デフォルトの名無しさん
05/12/06 11:45:40
読んだ知識をIOモナドの外で活用したい場合はどうしたらいいですか?

790:デフォルトの名無しさん
05/12/06 14:43:53
unsafePerformIO

791:デフォルトの名無しさん
05/12/06 17:22:33
年度内って、来年の四月までってこと?

792:デフォルトの名無しさん
05/12/06 20:00:58
URLリンク(i.loveruby.net)

12月内ってことじゃない?

793:デフォルトの名無しさん
05/12/06 20:06:08
出版前に査読してもらうってことだろ。

794:デフォルトの名無しさん
05/12/06 20:11:14
>>793
ごめん。reviewの意味を勘違いしていた。

795:デフォルトの名無しさん
05/12/17 10:02:29
ごめん、以下のプログラムが読み解けないです
「addの戻り値型は引数型の関数となっている、と指定している」
ということらしいのですが、誰か解説してくれまへんか

class Add a b c | a b -> c where
add :: a -> b -> c


796:デフォルトの名無しさん
05/12/17 10:41:58
functional dependency ってヤツだよ。
それは関数ではなくて、「aとbからcの型は一意に定まる」ことを示している。
URLリンク(www.cse.ogi.edu)


797:デフォルトの名無しさん
05/12/18 04:23:05
"100" から 100 を取り出すような関数はどうやりますか

798:デフォルトの名無しさん
05/12/18 08:25:32
readの作り方?

799:デフォルトの名無しさん
05/12/18 08:52:39
>>797
read "100" :: Int

800:デフォルトの名無しさん
05/12/18 09:26:10
>>798
そうです。

>>799
言葉足らずですみません。

801:デフォルトの名無しさん
05/12/18 11:11:46
foldl (\x y->10 * x + (ord y - ord '0')) 0

802:デフォルトの名無しさん
05/12/18 14:55:27
浮動小数の桁数指定で最後の桁の次を四捨五入の場合は?


803:デフォルトの名無しさん
05/12/18 15:29:40
何の話?

804:デフォルトの名無しさん
05/12/19 15:50:32
roundN :: (RealFrac a, Integral b) => a -> b -> a
roundN x n =
(frac (round (x * b))) / b
where b = 10 ^^ n
frac = fromRational . toRational


805:797
05/12/20 01:34:36
>>800
誰だ君…

>>798
そうです。

>>799
言葉足らずですいみません。

806:デフォルトの名無しさん
05/12/20 08:55:38
Webで以下のような定義を見かけたのですが、

data List a = Nil | Cons a (List a)

instance Eq (List a) where
Nil == Nil = True
Cons x xs == Cons y ys = xs == ys
_ == _ = False

Cons x xs == Cons y ys = xs == ys
の部分って正しいの?
このままだと (Cons 1 (Cons 2 Nil)) == (Cons 1 (Cons 3 Nil))
が True になるんだけど・・・
かといって
Cons x xs == Cons y ys = x==y && xs == ys
とかすると、最初のほうの x==y で
「add (Eq a) to the class or instance method `=='」
とか怒られるんだけど、じゃーどう定義したらよいのか
わかりまへん

807:デフォルトの名無しさん
05/12/20 09:00:55
>>796
ありがとうございます。まだよくわかってないですが
読んでみます。

808:デフォルトの名無しさん
05/12/20 10:37:50
>>806
リストという構造自体の等価性の問題ですから
中身は関係ない(というか見ちゃいけない)のです

add (Eq a) to the class or instance method `=='
とあるように,
中身の等価性まで考えようとしたら,List に格納できるデータ型
が Eq クラスのインスタンスに制限されてしまうのです.

809:デフォルトの名無しさん
05/12/20 10:47:45
>>797じゃないですがReadのインスタンスの作り方わからない…
readsPrecとreadListの作り方のチュートリアルか何かないでしょうか(できればShowの方も)
Haskell98Report読んでもサッパリです

810:デフォルトの名無しさん
05/12/20 13:02:57
instance Eq a => Eq (List a) where
 Nil == Nil = True
 Cons x xs == Cons y ys = x == y && xs == ys
 _ == _ = False


811:デフォルトの名無しさん
05/12/20 18:59:40
>>808
なるほど。納得です。

>>810
こうすると出来ますね。
Eq クラスのインスタンスに制限されるってこういうことだったのですね
有難うございました。

812:デフォルトの名無しさん
05/12/21 23:26:59
>>809
チュートリアルじゃないけど、GHC.Readにいくつかinstanceの例がある。
URLリンク(cvs.haskell.org)

理解したら、是非チュートリアルを書いてくれ。

813: ◆SaiTAMaVxg
06/01/09 08:32:36
                  ミ  (  ノ
                      / ̄\   ♪ 
                   〜(゚ ∀ 。 )⌒    
                 ♪   \_/  彡
                     ノ ι  ヽ

              ♪  .ハ
            ,ヘ    ((
            )ノ    .))
            (( ∧∧//
               \(゚∀゚ )      
              )  ノ         ヾ     ♪
          ミ シ´ /            ,γ 
         ミ r´  (          ∧∧//   
           ヽ、  ヽ  彡 ♪   ( ゚∀゚)'   
             )  ノ 彡       .,/   ヽ ミ
            ノ ,、(       ノ ノヽ   l
           r´/ ) )   ミ (´/  ノ ノ
          ( (  ( (         γ´ (´
           ヽ)  ヽ\       ノ ハ ヽ   ♪
               ノ  ) .   / ,,/ (,,ノ 彡
         ♪    (__ノ     (_,,ノ


814:デフォルトの名無しさん
06/01/22 22:44:58
URLリンク(shootout.alioth.debian.org)
パフォーマンスが凄いことになってる。

815:デフォルトの名無しさん
06/01/23 00:03:09
shootoutって、普通のプログラマが見ても
「Cはやっぱり速いなあ」とか「インタプリタはやっぱり遅いなあ」とか
「Javaはやっぱりメモリ喰いだなあ」とか思うだけで、
「関数型言語頑張ってるな。ちょっと使ってみるか」とは全く思ってくれない罠。

816:デフォルトの名無しさん
06/02/02 21:41:39
複数の関数の挙動に影響を与える「オプション」を外部(コマンドラインとか)から指定したいとき
C++みたいな言語の「thisの省略」がすごく羨ましいんだけど、
似たようなことをHaskellっぽく書けないものだろうか。

implicit parameterでそれなりに書けそうだけど、
使われてるのを見たことがない。

みんな明示的に引数を持ち回るのが苦痛じゃないのか?

817:デフォルトの名無しさん
06/02/02 23:15:17
>>816
そんな君にReaderT。
StateTでもいいぞ。


818:デフォルトの名無しさん
06/02/02 23:46:36
>>817
おー、ありがとう。
この目的のためにReaderモナドで計算順序を導入するのには抵抗があったけど、
既にもなでぃっくなコードにReaderTを混ぜ込むなら面倒が少ないな。

819:デフォルトの名無しさん
06/02/05 07:29:06
この言語は素晴らしいですか?

820:デフォルトの名無しさん
06/02/05 07:47:59
最高ですかー!

821:デフォルトの名無しさん
06/02/05 08:28:42
この言語の、C++に較べて、劣っている点を教えて下さい。

822:デフォルトの名無しさん
06/02/05 10:42:57
・C++ではテンプレートを使ってコードの抽象性と実行時効率を両立できるけど、
Haskellでは困難。

・C++では名前空間・クラス・関数をかなり自由に相互ネストさせられるし、
ネストに従って細かくスコープを分けてくれるのに対して、
Haskellの名前空間はフラットで、レコードのフィールド名のスコープがモジュールレベルだったり、
関数に局所的な型の定義ができなかったりして不便。

・互いに関連のないものに同じ名前を与えるC++風の多重定義は難しい。
やってできないことはないけど、想定された言語の使いかたではないだろう。

823:デフォルトの名無しさん
06/02/06 00:21:58
俺は今酔ってるし、ニートだし、最強だ。
モナディウスを参考にシューティングゲーム作るぞ。うぉー!

824:デフォルトの名無しさん
06/02/06 00:33:36
>>823
マジ応援してる。

825:デフォルトの名無しさん
06/02/06 03:51:37
出来上がったコードの実行速度はめっちゃ遅いですか?

826:デフォルトの名無しさん
06/02/06 06:11:44
>>825
>>814

827:デフォルトの名無しさん
06/02/06 07:33:29
Haskell Hackerが超がんばってキモいコード書けばgcc相当にはなるらしい。
俺のような凡人が普通に書いたらめっちゃ遅い。

828:デフォルトの名無しさん
06/02/06 09:10:24
ハスケルハッカーがキモいコードを書けば、
バグは少ないわ高速だわの最強のコードが生成されるのですね?

それとも、キモいコードってのはバグを許す代わりに高速にするとかいう類の話?

829:デフォルトの名無しさん
06/02/06 22:46:13
URLリンク(shootout.alioth.debian.org)
URLリンク(shootout.alioth.debian.org)

・コンパイルが大変で、
・コードが読みにくい分バグが多く、
・遅い

830:デフォルトの名無しさん
06/02/06 23:05:14
確かに読みにくいね。

>・コンパイルが大変で、
どういう意味?

831:デフォルトの名無しさん
06/02/07 05:53:35
ハスケル勉強したいが
参考書がきっと1万とか法外な値段でしょ?
手が出ません><


832:デフォルトの名無しさん
06/02/07 06:09:11
数学やってる人がHaskellを直ぐに分かるのは、
集合論と一階述語論理について勉強済みだからなんだよね?

833:デフォルトの名無しさん
06/02/07 10:27:09
もうすぐ青木さんの本とかが出るでしょ。
使うだけなら数学の話は特に必要ないよ。たぶん。


834:デフォルトの名無しさん
06/02/07 11:00:55
数学の知識はいらないと思うけど、論理学の基礎なしじゃむりだぽ。

835:デフォルトの名無しさん
06/02/07 16:18:33
数学に基づいて作られた言語ではあるが,その理念を理解して利用するのと,ただプログラミング言語として利用するのとでは意味が違う。

836:デフォルトの名無しさん
06/02/07 16:28:17
「アルゴリズムのプロトタイピングなら C や Java よりも簡単で,早くできます」

とは大学の教官の弁。単位きたかなあ。

837:デフォルトの名無しさん
06/02/07 16:54:31
早く作れても速く動かないのではなぁ…

838:823
06/02/07 17:13:22
>>837
みんなで速くするんだと思います><
CやFORTRANが速いのは多分歴史が長いからだと思ってる

--以下チラシの裏

今日やったこと:eclipseの日本語化とFPの導入

一言:eclipseをeclispだと思ってて「HaskellなのになんでLisp?」とか考えてた。英語弱いな、俺

今からやること:エヴァの映画借りてきて見る

839:デフォルトの名無しさん
06/02/07 21:16:35
>>837
だからプロトタイピングなんだろ。
物好きがいろいろやってはいるけど、どう考えても研究用途の言語だよな。
だから意味がないというわけではないが。

840:デフォルトの名無しさん
06/02/07 21:46:46
>>839
ちょっとお前は論点ずれてるよな。

841:デフォルトの名無しさん
06/02/07 22:30:09
>>830
liftMとか素人なら完全に御手上げ。
あと、何この演算子?ってのを使ってる
(.|. (shiftL i 3)) -- google氏も無視

逆にhaskellが神言語になってる例
URLリンク(shootout.alioth.debian.org)
URLリンク(shootout.alioth.debian.org)
d 言語90行
haskell 11行
実行速度ほぼ同じ

理由
Integer型が使える
Monadを使う必要もMonad持ち上げをする必要がない。(配列を使う必要がない)

842:デフォルトの名無しさん
06/02/08 18:30:21
>liftMとか素人なら完全に御手上げ。
たぶん、すぐ慣れると思う。

>(.|. (shiftL i 3)) -- google氏も無視
そんなあなたにHoogle
URLリンク(www.haskell.org)

843:デフォルトの名無しさん
06/02/08 21:20:50
>>842
すげー。
型から検索できるのがHaskellらしいな。

844:デフォルトの名無しさん
06/02/09 09:48:51
みなさんは、式がどういう順番で評価されていくか
手にとるようにわかるのですか?
私はどう書いたら速いコードになるのかいまいちわかりません。


845:デフォルトの名無しさん
06/02/09 13:07:28
評価順序など考えない。何のための遅延評価だと思っとる。

速いコードを書くのが目的なら関数型言語など、いや、
高級言語など使うのはお止めなさい。

846:デフォルトの名無しさん
06/02/09 13:19:59
普段は評価順序なんか考えないでコーディングして、
効率が足らないことが分かったとき、そこをアセンブリで書き直す代わりに
既にあるHaskellのコードをいじって効率を確保する、というのは、
それなりに合理的だと思うんだが。

847:844
06/02/09 13:44:18
べつに速さで C と張り合おうとか思ってるわけではないのですが、例えばhead $ xs ++ [x]が O(1) かどうかというのは、評価順がわからないとわからないですよね?こういう簡単な例なら私にもわかるのですが、ちょっと複雑になると頭を抱えてしまうわけです。

848:823
06/02/09 14:15:14
>>847
多分、どんな順序で書いてもコンパイラが同じように並べかえてくれるんじゃないかなぁ?
コンパイラが考えうる中で最も効率的なコードが出るようにね

849:デフォルトの名無しさん
06/02/09 14:16:51
>>847
非正格になれてないだけ。

850:デフォルトの名無しさん
06/02/09 19:00:42
個人的経験では、Haskellerの半分はスピードレーサー(最適化おたく)だと思う。

851:デフォルトの名無しさん
06/02/09 22:26:31
マシン非依存の部分ならば、
Cよりhaskellの方が速いコードが書けるはず。
なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない)
無駄なく書けるから。

cだと、綺麗なコードを書くために無駄なコードを書きまくると思うし、
汚い普通のコードを書いても、Haskellと同程度しか速くならない。

cの有利な点は、
gcがない, 配列操作, アセンブラ的コードが書ける, 速いライブラリがある。

と言ってみる。

852:デフォルトの名無しさん
06/02/09 22:37:03
非正格だから遅いみたいな話は聞いた事がある。詳細は知らないけど。

>>851
>なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない)

これは速いコードとは関係ないんじゃないの?
早くコードを書く事は出来るのかもしれないが。

853:デフォルトの名無しさん
06/02/09 22:37:18
「マシン非依存の部分」なんてあるのか?

854:デフォルトの名無しさん
06/02/09 22:39:54
Haskellのソースはスリムだがバイナリがピザデブ杉。

855:デフォルトの名無しさん
06/02/09 23:28:22
>>853
add

856:デフォルトの名無しさん
06/02/10 03:01:51
Haskell学んでC++でメタプログラミング
これ最新最強。newなんていりませんから!

857:デフォルトの名無しさん
06/02/10 10:53:42
なんでCはいつも最速なの?

858:fortran
06/02/10 10:55:08
・・・

859:デフォルトの名無しさん
06/02/10 12:50:24
最速はアセンブリ言語


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

5378日前に更新/259 KB
担当:undef