トップページtech
1001コメント339KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001a36 ◆K0BqlCB3.k 2011/10/07(金) 12:27:25.71
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
0153デフォルトの名無しさん2011/10/15(土) 18:06:20.12
>>152
あ、すいません

[a] を [b] に変換です
0154デフォルトの名無しさん2011/10/15(土) 18:22:17.68
>>153
>>146に乗っかっただけ
0155デフォルトの名無しさん2011/10/15(土) 18:27:44.90
セルが半シフトしたリニア・セルラー・オートマトンだよな。
0156デフォルトの名無しさん2011/10/15(土) 18:33:46.42
mapだと単なる写像とか関手って意味しかなくて、そんなものは型みりゃ一目瞭然でそんなのを型と名前で二回も使ってると
頭痛が痛いみたいな違和感が出てきてちょっとDRY的によろしくない感じ
zipだともうちょっと意味が狭くなって [a] `f` [b] -> [a `f` b]的なリストとfの分配法則みたいな意味が出てくるけど
これも型みりゃだいたい入ってる、こちらは入れてもいい気もするけど
だから隣り合ったを示す言葉とか二つ目を一個ずらすみたいな命名ができると余すところ無く名前と型両方に無駄なく意味をこめることができていいかなぁ
とか思った
0157デフォルトの名無しさん2011/10/15(土) 19:01:54.05
Aは haskellerならappricativeを想像するんじゃないかな。
0158デフォルトの名無しさん2011/10/15(土) 19:04:04.21
perlninja2
メンバ
登録日: 2011-09-30
投稿: 10
E-mail

いまCD-R 700MBとガリガリ君ソーダ味かってきました

Ubuntu入れなおしたほうが早いと思いました

回答ありがとうございました
0159デフォルトの名無しさん2011/10/15(土) 19:05:30.71
perlninja2
メンバ
登録日: 2011-09-30
投稿: 10
E-mail

Ubuntuを起動するとフリーズしていまいます
ターミナルの画面が真っ白で、ちょっと動かすと元の色にもどります
そしてウインドウを動かしたり ターミナルにコマンド打ち込んだり フォルダ開いたりしようとすると反応がありません
上のメニューバーの再起動とかログアウトはボタン選べるんですが まったく応答がありません
いろいろデスクトップのフォルダを開こうとしても開けないです
どうすればいいんですか?教えてください
直しかた教えてください

昨日まで普通に使えてたのに突然使えなくなりました
再起動したりなんかいも起動しなおしても同じ現象です
0160デフォルトの名無しさん2011/10/15(土) 19:14:16.51
Perl忍者はHaskellができません。
ですが、ここのスレに来てはいけないというルールはありません。
0161デフォルトの名無しさん2011/10/15(土) 19:17:23.16
>>157
では、mapAdj や mapN (N = Neighborhood) で


>>156
「名前と型両方に無駄なく意味をこめる」
なるほど、そういう考え方もあるのですね

わたしは、改めてこの関数を使うプログラマの立場に立って考えてみると、
型シグネチャはライブラリ ドキュメントを見ることでしか確認はせず、
普段ソース中でこの関数を使っている時は関数名しか見ないと思いました
そして、ライブラリ ドキュメントはソースに比べてそう頻繁に見るものではない
(自分がそうなので)

だからソースを眺めた時、この関数を使っているところで、
「何がどのような結果になるのか」という情報が仕舞われた頭の抽斗が開けやすくなる、
抽斗の場所がぱっと思い浮かぶようなキーワードがいいなと
ポイントフリーで使っていると余計にそう感じます

というわけで、私はむしろ型シグネチャで分かる意味・ニュアンスも、
積極的に関数名に入れていこうと、皆さんの意見を聞いて思いました
0162デフォルトの名無しさん2011/10/15(土) 19:18:30.54
0163デフォルトの名無しさん2011/10/15(土) 20:12:34.89
セルラーオートマトンの文脈では、fがevolverでgがtransducer
0164デフォルトの名無しさん2011/10/15(土) 21:42:48.20
変換って、いろいろな言葉があるよね。

translator
tramsformer
transducer

厳密な使い分けはあるのだろうか?
0165デフォルトの名無しさん2011/10/15(土) 22:11:44.66
>>164
converter、diverter などもありますね
0166デフォルトの名無しさん2011/10/15(土) 23:12:07.79
内部で非ボックス化タプルを使ってる hs ファイルは
ghci ではロードできないのでしょうか

ghc コマンドでは普通にコンパイルできたのですが、
ghci の :l でロードしようとすると、次のようにメッセージが出ます

Error: bytecode compiler can't handle unboxed tuples.
Possibly due to foreign import/export decls in source.
Workaround: use -fobject-code, or compile this module to .o separately.

これは、ghci でロードしたかったら、hs ファイルではなく
オブジェクト ファイルにコンパイルしとけ、という意味でしょうか

ghci でロードできないのでしたら、一つのソースコードで、
ghc でのコンパイルの場合は非ボックス化タプルを使って、
ghci でロードする場合は普通のタプルに自動的に切り替える
というようなことはできないでしょうか
0167デフォルトの名無しさん2011/10/16(日) 10:45:43.20
>>125
ハスケルたんは悪くない(キリッ
勉強不足の初心者が悪い!

ですか?
0168デフォルトの名無しさん2011/10/16(日) 11:56:15.70
>>166
そういうこと。あるいはghciに-fobject-codeを渡すのでもいい

>というようなことはできないでしょうか
少なくとも今はできない
0169デフォルトの名無しさん2011/10/16(日) 12:07:28.59
>>167
丁寧に答えてくれた人に 何しょうもない事言ってんねん。どっかいけ
答えてもらって助かったからそれでええんじゃ。
0170デフォルトの名無しさん2011/10/16(日) 12:20:19.09
初心者はハスケルたんを汚す悪いやつ!
0171デフォルトの名無しさん2011/10/16(日) 12:26:32.54
敷居が高いおかげでドカタが流入してこないから
Haskell界は住みやすくpurityが保たれている
ありがとう>125
0172デフォルトの名無しさん2011/10/16(日) 12:35:10.32
>>171
でも、スレには何も知らずに荒らす連中が来るようになってる。
日本語版stackoverflowでもあったほうがいいんだろうかね。
0173デフォルトの名無しさん2011/10/16(日) 12:59:22.17
日本語版か...おぞましいことになりそうな悪寒

忍法帳を発展さてくれればいいんだけど嫌がるひとも多いか
あとプログラム板でもID表示とか
0174デフォルトの名無しさん2011/10/16(日) 13:06:48.21
>>171
こうしてHaskell界では
モナドモナドモナドモナカモナコ....だけでスレが消費され続けるのですた
メデタシメデタシ
0175デフォルトの名無しさん2011/10/16(日) 13:44:32.75
くっぷぷぅ
0176デフォルトの名無しさん2011/10/16(日) 14:15:40.79
>>168
> あるいはghciに-fobject-codeを渡すのでもいい

なるほど、ロードする度にオブジェクトコードを生成するよう指示すれば
ghc の様にコンパイルされるので非ボックス化タプルが使えるのですね

で、欠点はコンパイルに時間を要するかも知れないことと、
ghci のデバッガからは見えないことですね

> 少なくとも今はできない

わかりました
デバッガは今までも特に活用したことないので、
-fobject-code オプションでの対処で凌ぐことにします
0177デフォルトの名無しさん2011/10/16(日) 14:27:50.62
>>173
おぞましくさせない工夫が必要なほど幼稚な日本語をしゃべる人
(日本人とは限らない。)が多いのは事実だ。アノニマスには
開放できない罠。一番いいのは英語を使えることというのは否定でけん。
0178デフォルトの名無しさん2011/10/16(日) 14:35:19.94
http://stackoverflow.com/questions/tagged/haskell
stackoverflowのhaskellタグ。
0179デフォルトの名無しさん2011/10/17(月) 22:52:36.79
haskellって、コンパイルしたらJavaバイトコードのような
中間言語を吐き出すのでしょうか?
それとも機械後を吐き出してくれるのでしょうか?
0180デフォルトの名無しさん2011/10/17(月) 23:01:04.24
>>179
それは言語の仕様ではないので厳密には実装によるが、デファクトスタンダードのGHCは基本的にネイティブコードを吐く。
0181デフォルトの名無しさん2011/10/18(火) 00:53:08.36
http://www.haskell.org/ghc/ では、
> GHC compiles Haskell code either directly to native code or using LLVM as a back-end. GHC can also
> generate C code as an intermediate target for porting to new platforms. The interactive
> environment compiles Haskell to bytecode, and supports execution of mixed bytecode/compiled programs.
という紹介になってた。
01821792011/10/18(火) 13:32:09.88
ありがとうございます。
0183デフォルトの名無しさん2011/10/20(木) 11:39:21.53
質問なのですが、windows上でGHCでコンパイルして、出来上がったhello.exeファイルをダブルクリックで実行するには、どうすればよいですか?
コマンドプロンプトから、ファイル名を入力したら、実行はできます。

0184デフォルトの名無しさん2011/10/20(木) 12:31:00.43
>>183
たぶん、実行はされているけど、すぐにプログラムが終了してコンソールが閉じているだけだと思う

main = let loop = loop in putStr "Hello World!!\n" >> loop

でコンパイルしてダブルクリックしてみ
0185デフォルトの名無しさん2011/10/20(木) 13:20:15.64
>>184
ありがとうございます!
その通りでした!
0186デフォルトの名無しさん2011/10/20(木) 22:49:20.89
FizzBuzzを剰余使って書くのはすぐ思いつくけど、以下のは新鮮だった。
どうやったらこんな発想が出来る様になるんだろ。

fizz = cycle ["","","Fizz"]
buzz = cycle ["","","","","Buzz"]

f s n
| s == "" = show n
| otherwise = s

main = print $ zipWith f (zipWith (++) fizz buzz) [1..100]
0187デフォルトの名無しさん2011/10/20(木) 23:11:26.56
>>186
オレ、そのアルゴリズム自力で思いついたけど、そんなに不思議かな。
たしか、3を法とする商群と5を法とする商群をなんとかすれば・・・ みたいなことを考えていて、思いついた
01881862011/10/20(木) 23:29:22.83
>>187
C、java、rubyと来たのでmapは理解していたけど、手続き型言語には無い発想だと思う。
ついでに言うと、今なら手続き型言語ユーザーが何故、関数型言語を誤解するのか判る気がする。
「関数」「型」「評価」など、同じ字面でも関数型言語とは違う意味で説明される物が多い。
0189SCHEME餃子 ◆8X2XSCHEME 2011/10/20(木) 23:52:51.12
要するに根本的なパラダイムが違うって話だよな

英語で話すときは英語で考えなきゃ滑らかに話せないって話は聞くけど、
Haskell で書くときは Haskell で考えなきゃいけないってことだろ
0190デフォルトの名無しさん2011/10/20(木) 23:53:46.97
>>186
いいかどうかは別にして、カウンタやインデキシングを避けて、
何でもリストで考えればそうなる。
そうするとリストの代数的操作でプログラミングするようになる。
Richard Bird先生の本を読むのがいいかもしれない。
01911872011/10/21(金) 00:00:33.30
>>188
逆にオレはfor文でFizzBuzz書けとかいわれたら、戸惑うかな? たぶん戸惑うな。
whileでとか憤死するレベル。
0192デフォルトの名無しさん2011/10/21(金) 00:05:06.91
よーしパパFizzモナドとBuzzモナドを合成しちゃうぞー
0193デフォルトの名無しさん2011/10/21(金) 00:10:44.14
でも それ、1から連続する数字のリストだから正解なだけで
あまりいい回答ではないと思ったかな。fibbuzzとかはやってるけど
関数型言語の普通の作り方すれば、最後のリストを[1..100]と
違うのだけの違いだから新鮮にも見えなかったよ。抽象化が得意な言語
とそうでないものでのさがあるんだなということかな。

prnFizzBuzz = mapM_ putStrLn.FizzBuzz
FizzBuzz n 。。。パターンマッチ


prnFizzBuzz [1..100] とか prnFizzBuzz fibSeq とかでおしまいだろ?
0194デフォルトの名無しさん2011/10/21(金) 00:14:42.74
for文などでかけと言われたらかけるけど、関数型の記述に比べれば
泥臭くって、抽象化ができないよね。関数オブジェクトなどを使って
抽象化させて作るんだったら、初級っぽくないだろうし。
0195デフォルトの名無しさん2011/10/21(金) 07:52:37.50
mplusを使ってfizzbuzzを書こうとすると現行のMonadPlusの駄目な部分がわかるかも
01961862011/10/21(金) 08:04:56.77
>>190
>>186
>Richard Bird先生の本を読むのがいいかもしれない。

情報有難う!
Research paperを幾つか、ざっと読んでみた。
まだよく理解出来ない所も多いけど、Haskellって面白い。
0197デフォルトの名無しさん2011/10/21(金) 08:52:36.35
>>194
細かい抽象化は全体からみれば効果がないだろうよ
0198デフォルトの名無しさん2011/10/21(金) 09:48:20.45
>>196
鳥先生に興味が出てきたら早速ピアソンのサイトへ行ってAlgebra of Programmingを手に入れるんだ
0199デフォルトの名無しさん2011/10/21(金) 10:38:23.33
>>197
何を優先してるかで違うのは当然だが、抽象化のセンスを見るのにも
いいとは思うがな。ボイラープレイトを取り除くにしても、この手の単純な
抽象化が出来なければ難しく感じるだろう。

余談だが、この辺の抽象化のセンスってLispのマクロを作るセンスにも通じ
てる印象がある。マクロで関数を作成するにしてもマクロを作成するにして
もボイラープレイと除去と同じセンス必要なので。
0200デフォルトの名無しさん2011/10/21(金) 11:19:02.96
>>192のアイデアを水平合成とみて>>186のに適用するとこんな感じ?

type Magma a = a -> a -> a
class MonadZero m where
mzero :: m a
class MonadZero m => MonadOr m where
mor :: Magma (m a)
class MonadZero m => MonadPlus m where
mplus :: Magma (m a)
instance MonadZero [] where
mzero = []
instance MonadOr [] where
mor xs = if null xs then id else const xs
instance MonadPlus [] where
mplus = (++)

fizz = cycle $ replicate 2 mzero `mplus` return "Fizz"
buzz = cycle $ replicate 4 mzero `mplus` return "Buzz"
fizzbuzz = zipWith mplus fizz buzz

main = print $ zipWith mor fizzbuzz $ map show [1..100]

listモナドの和を論理和(つまりMaybeモナドの和)、数値和の二通りに見ることで数値和で作ったfizzbuzzのパターンと数字のパターンを論理和で合成する・・・と
Listを信号としてみれば、もろor回路による信号の合成だよな。始まる場所が変わることに対してはdrop等で開始位置をずらしてつまり信号のdelay回路か
SignalArrowを使った抽象化でもいけそうに見えるな
それはさておき垂直合成、つまりモナド変換子を使うのはどうなるんだろうか
FizzT (FuzzT Identity Int) [String]みたいな型になればそれっぽいんだけど
0201デフォルトの名無しさん2011/10/21(金) 12:37:44.28
>>194
で、いざHaskellでEnumeratorとモナド使ったfor記法が定義されたら
嬉々として使うんだろ?
0202デフォルトの名無しさん2011/10/21(金) 12:43:09.39
>>201
いらないよ。ループ系ですらほとんど使わないのに。
0203デフォルトの名無しさん2011/10/21(金) 12:50:12.54
>>201
それってfoldlとどう違うの?
0204デフォルトの名無しさん2011/10/21(金) 14:40:50.67
>>201
そんな書き込みして何が楽しいの?
0205デフォルトの名無しさん2011/10/21(金) 17:53:37.66
>>189
思考が言語を作ったが
今や言語が思考を制限するのですね
0206デフォルトの名無しさん2011/10/21(金) 18:00:38.90
自然言語では当たり前の話だが、言語=思考なんだよ。
0207デフォルトの名無しさん2011/10/21(金) 18:07:06.79
自然言語ですら異論ありまくりだよ
0208デフォルトの名無しさん2011/10/21(金) 18:27:55.96
たとえばMatzあたりがよく引き合いに出すが、そんなに支持されてる仮説じゃない

あと、エキスパートの思考は言語化できないことが多い
0209デフォルトの名無しさん2011/10/21(金) 19:45:59.14
エスパーの思考に見えた
0210デフォルトの名無しさん2011/10/21(金) 21:08:24.89
明日筑波でHaskellな話してくるよ!
0211デフォルトの名無しさん2011/10/21(金) 21:33:02.92
まだハスプラ更新されない
毎回のように延期するんならもうちょっと余裕を持ってスケジュール宣言しとけよ
0212デフォルトの名無しさん2011/10/21(金) 21:47:04.40
ドラクエみたいなモンだよ

スケジュール通りに発売されたドラクエなんて、逆に心配だろ?
0213デフォルトの名無しさん2011/10/21(金) 22:00:15.46
確かに長々と書いたC++のコードが一発でコンパイル通った時くらい眉唾だな
0214デフォルトの名無しさん2011/10/21(金) 22:25:17.56
>>198
URLぷりーず。
ピアソン?
0215デフォルトの名無しさん2011/10/21(金) 23:43:26.13
>>210
Matz王国へ乗り込むんだな。
0216デフォルトの名無しさん2011/10/21(金) 23:54:23.33
>>214
http://www.pearsoned.co.uk/bookshop/detail.asp?item=100000000010900
0217デフォルトの名無しさん2011/10/22(土) 16:35:01.20
Winでgtk2hs使えるようにするのって大変っぽい?
linuxだとcabalをapt-getで入れて、gtk-buildingToolsをcabalで入れれば良いだけみたいなんだけど、Winのgtk2hsインストール手順が別になってて複雑っぽい。。。
0218デフォルトの名無しさん2011/10/22(土) 16:47:47.56
最新の Haskell Platform を入れているのなら、以下の手順でインストールできる

1. http://www.gtk.org/download/win32.php へ行き、
All-in-one bundles のバージョン 2.16 をダウンロード(2.22 ではダメ)

2. All-in-one bundles を展開してホワイトスペースが無いパスに置き、
All-in-one bundles の \bin ディレクトリへのパスを環境変数 %PATH% に追加する

3. GHC インストールフォルダ内の mingw/bin ディレクトリへのパスも
環境変数 %PATH% に追加する

4. cabal install gtk2hs-buildtools
次いで cabal install gtk


最新の Haskell Platform にある GHC のバージョンより
高いバージョンの GHC を入れていたり、別の環境だったりした場合、
どうするかは知らん
0219デフォルトの名無しさん2011/10/22(土) 17:18:04.17
>>218
ありがとう
やってみます
0220デフォルトの名無しさん2011/10/22(土) 17:20:56.32
filter 関数とか、いいかげん型クラスの関数にして、
ライブラリの構造を整理してほしいな
0221デフォルトの名無しさん2011/10/22(土) 17:54:16.39
>>218
失敗したみたいなんですが、cドライブ直下だとダメとか、ありますでしょうか?
0222デフォルトの名無しさん2011/10/22(土) 18:02:28.53
今更気付きましたが、Win7のx64環境です
だからダメと言う事は在るのでしょうか?
ghcにあわせてwin32版を落として設定して失敗してます
0223デフォルトの名無しさん2011/10/22(土) 18:28:23.45
>>222
ごめん、言い忘れてた
私の環境は

OS : Windows7 Home Premium 32bit
Haskell Platform : 2011.2.0.1

これ以外の環境でどうやるかは分からない

> だからダメと言う事は在るのでしょうか?

あるんじゃないかな
64 bit 版の All-in-one bundles でやってみたらどう?
さっき提示したページの上部に [Download] のリンクがあるから、
そこから 64 bit 版へ飛べる(まだ実験バージョンだと書かれているが)
0224デフォルトの名無しさん2011/10/22(土) 18:34:53.13
>>223
私の方こそ忘れてました。
haskellPlatformは同じバージョンを使ってます。

ダメモトで64bit版も試してみます。
0225デフォルトの名無しさん2011/10/22(土) 18:50:11.12
いつのまにか、gtk2hs のサイトが復活してるな

http://projects.haskell.org/gtk2hs/
0226デフォルトの名無しさん2011/10/22(土) 19:56:50.82
>>223
何とかWin7の64bitでgtk2hsインストール完了しました

結論から言うと、gtk+の64bit版ではなく、>>218でダメと言われてた2.22で成功しました。。。
(手順はそれ以外は同じで、サンプルコードの動作確認も完了済み)

因みに、64bit版ではインストールに成功するものの、リンクでこけました

これでgtk2hsの勉強が始められそうです

ありがとうございました
0227デフォルトの名無しさん2011/10/22(土) 21:33:29.29
>>186
楽しいね、これ。ずっとスレ覗くだけだったけど、久しぶりにhaskellしたくなってきたよ。
0228デフォルトの名無しさん2011/10/22(土) 21:36:15.30
last [1..1234567890]
を早くする方法で悩み中。
リストの最後の数値は判ってるんだから、すぐに出力出来るはずなんだが…
0229デフォルトの名無しさん2011/10/22(土) 21:41:00.81
>>228
> リストの最後の数値は判ってるんだから

なぜ?
0230デフォルトの名無しさん2011/10/22(土) 21:42:14.51
>>228
リストは先頭からしか読めないからな
最後の数値を即座に取り出したいなら別のデータ構造を考える必要がある
0231デフォルトの名無しさん2011/10/22(土) 21:57:41.34
>>229
既にソースに書いてある。
先頭から見て行かないと判らない、というならそれはHaskellの出来の問題じゃないの?
0232デフォルトの名無しさん2011/10/22(土) 22:02:58.14
>>231
リストのデータ構造の性質
haskellじゃなくても、リストを使えば先頭からしか辿らない
0233デフォルトの名無しさん2011/10/22(土) 22:07:14.12
ハスケルの配列はO(1)なんだっけ?
0234デフォルトの名無しさん2011/10/22(土) 22:25:23.49
>>231
たとえば [1..3] は 1 : (2 : (3 : [])) であり、
「リストを構成するデータ型」の値だ
そして、 : や [] はこのデータ型の「値構築子」だ( : は中置値構築子)

last 関数は、last [] = errorEmptyList "last"; last (x:xs) = ・・・
という形のパターンマッチを行う関数だ

last [1..3] は last (1: (2 : (3 : []) なので、
(x:xs) にパターンマッチし、x=1、xs=(2 : (3 : [])) と束縛する

リストに限らず、データ型の値を作ってる値構築子の引数(この場合は 1 や 2 など)は、
このようにパターンマッチさせて値構築子を剥がす事でしか参照できない

で、リスト 1 : (2 : (3 : [])) がこのようなネスト構造を成している以上、
ネスト構造を「順に剥がしていく」ことでしか中の値は参照できない

ちなみに、f (_:_:x:_) = という関数で f [1..3] などとして一気に x=3 と束縛しようとしても、
内部で順に値構築子を剥がす処理をしてパターンにマッチするかを調べるから同じ事


これを 「Haskellの出来」 というのなら、そうだね、としか言いようがない
0235デフォルトの名無しさん2011/10/22(土) 22:55:21.45
>>234
haskellの出来じゃない

配列と違って、リストはメモリ上に連続して並んでる保証はない
だから、先頭から順々に次に要素のアドレスを参照していくしかない

配列なら、連続して並んでるから、先頭から要素のサイズをステップ数として、希望の位置までアドレスの参照先をずらせば良い

c言語でも同じ事
(haskellで配列使った事ないから分からんが、配列と言うデータ構造の性質としてはO(1)になるはず)
0236デフォルトの名無しさん2011/10/22(土) 22:56:21.45
x要素のサイズ
o要素一つのサイズ
0237SCHEME餃子 ◆8X2XSCHEME 2011/10/22(土) 23:06:30.13
>>231
構文木の段階の情報と、実行時の段階のマシンコード (バイトコード) ではレイヤが違う話。
レイヤをまたいでうまいことやれば…というのは個別の実装の最適化をがんばってもらうしかない。
0238デフォルトの名無しさん2011/10/22(土) 23:15:23.45
last [1..3] くらいならコンパイル時に展開してもいい気がするけど
それでじゃあ、この最適化があれば実装の出来がいいかって言われると
うーん
0239デフォルトの名無しさん2011/10/22(土) 23:25:42.57
>>238
うん?
ghciの話じゃないのか

ghcにO2オプション付ければ積極的に最適化されるから、

last [1..3] = 3

みたいに最適化されてんじゃないの?
0240デフォルトの名無しさん2011/10/22(土) 23:44:29.49
>>239
少なくとも GHC 7.0.3 ではされません
0241デフォルトの名無しさん2011/10/22(土) 23:47:33.53
>>186が楽しいって感覚は分からないな
Haskellや関数型プログラミングらしくなくて、むしろ気持ち悪いくらいなんだけど
0242デフォルトの名無しさん2011/10/22(土) 23:54:35.79
>>186
俺は、楽しいかどうかというより、
そういう発想が他のどういうところに活かされるのか気になる
0243デフォルトの名無しさん2011/10/22(土) 23:56:32.37
FP的だから関数型言語的と言っていいと思う。
0244デフォルトの名無しさん2011/10/23(日) 00:00:25.87
>>243

>>241 はFP的ではないと感じてるわけだから、
どの辺りがFP的か簡単にでも説明してあげないと堂堂回りになるよ
0245デフォルトの名無しさん2011/10/23(日) 00:03:30.59
http://en.wikipedia.org/wiki/FP_(programming_language)
の事ってのは通じてる?
Bird先生の本もこの系譜になると思うけども。
0246デフォルトの名無しさん2011/10/23(日) 00:25:49.78
通じないだろw
普通はプログラミングパラダイムの方を思い浮かべる
0247デフォルトの名無しさん2011/10/23(日) 00:30:01.52
FPと言えばBackus先生のFP!
Function Programmingの略!
これが関数道の正しい道!
0248デフォルトの名無しさん2011/10/23(日) 00:32:44.35
どっちでもいいけど
>>186のどこが関数的?
0249デフォルトの名無しさん2011/10/23(日) 00:41:48.58
逆にどこが違う?
0250デフォルトの名無しさん2011/10/23(日) 01:26:52.91
>>248 じゃないけど、おれも >>186 のどこが関数的か分からん

関数的とも手続き的手も言えん、なんとも分からん代物
0251デフォルトの名無しさん2011/10/23(日) 01:42:08.77
こんなの関数的な要素は全く無いだろ
mainの最後を[2..100]と変えたらおかしくなることからして関数的でないことが分かる

それに関数的かどうかとは別に、プログラムとしても洗練されてない
fizzとbuzzの空文字列や関数fに数値を渡す設計はどうにかならなかったのかと思うし
fの中で文字列の比較をしてるのも酷い

Bird先生?難しい本を薦める前に添削してやれよと…
0252デフォルトの名無しさん2011/10/23(日) 04:25:14.59
BackusのFPはポイントフリースタイルのイメージだね。

Bird先生は別に要素レベルの演算までリストでやれと言ってるわけではないと思う。


lift n = (n,"")
fizz (n,s) = (n,s ++ if n `mod` 3 == 0 then "fizz" else "")
buzz (n,s) = (n,s ++ if n `mod` 5 == 0 then "buzz" else "")

fizzbuzz xs = map (buzz . fizz . lift) xs

くらいでも関数的と言っていいんじゃないか。


■ このスレッドは過去ログ倉庫に格納されています