関数型プログラミング言語Haskell Part3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
Http://www.teu.ac.jp/kougi/koshida/Prog6/index.html
過去ログ、関連スレは>>2-5
0067(define (´∀`) 'マターリ)
NGNGf n xs = [[xs !! (x + y) | y <- [..n-1]] | x <- [..(length xs)-n]]
0068デフォルトの名無しさん
NGNGたぶん、
× [..n-1] [..(length xs)-n]
○ [0..n-1] [0..(length xs)-n]
でしょう。
この場合、僕がはじめに作った関数同様、
無限配列で使えないので解としては、やや劣ると思われます。
それと、いちいち(!!)を使うのは効率上どうなんだろうか。
処理系なしで作ったのならしかたないか。
普段はlispを使っているようですね。
はじめにいれる処理系はhugsがおすすめ。
多少なじんできたら、がんばってghcをいれるといいかも。
>>66
いいね。
これもわりと感動もんかも。
単純な処理だと思っても以外と奥が深いもんだな。
以下は別に新しい考えかたは何もないですが、
上のほうで作っていた関数を見やすくしてみました。
p n xs = if drop (n-1) xs == [] then [] else take n xs : p n (tail xs)
dropとtakeを両方使ってるあたりが泥臭いかも。
無限配列を扱えるもののなかで最も素直な解だと思う。どうかな。
0069デフォルトの名無しさん
NGNGしまった。
書き込んでから気付いたのだが、これだと
p :: Eq a => Int -> [a] -> [[a]]
になってしまう。
まあ、素直な解ということで許してほしい。
0070デフォルトの名無しさん
NGNG# q n = filter ((==n).length) . k n
# where k _ [] = []
# k n xs = take n xs : k n (tail xs)
どうだろう。
0071(define (´∀`) 'マターリ)
NGNGf n xs = filter ((==n).length) [take n x | x <- tails xs]
0072デフォルトの名無しさん
NGNG>>44の#と一緒。
0073デフォルトの名無しさん
NGNG> f n xs = filter ((==n).length) [take n x | x <- tails xs]
でも素直でわかりやすい。同じだけど:
f n xs = filter ((==n).length) $ map (take n) $ tails xs
「関数のn乗」って関数はなかったんでしたっけ:
f n xs = (iterate chop $ map (take n) $ tails xs) !! n
chop (x:xs) = if null xs then [] else x : chop xs
f n xs = map (take n) $ chopn n $ tails xs
chopn n xs = fst $ foldr _chopn ([], n) xs
where _chopn x (xs, n) = if n > 0 then (xs, n - 1) else (x:xs, 0)
0074デフォルトの名無しさん
NGNG「関数のn乗」 -> ない。
chop -> init
> f n xs = map (take n) $ chopn n $ tails xs
> ....
無限リストに使えん。
気持ちは分かるんだが、
新しい良いアイディアが含まれていなかったり、
明らかに良くない方法だったりするものを
無闇に書き込むのは止めないか?(せめて欠点を併記するとか)
他の初心者が無分別に使うかもしれないし、
いいアイディアのものが埋もれる。
中級者以上(?)には面白くないし。
0075デフォルトの名無しさん
NGNG> 「関数のn乗」 -> ない。
なぜないんでしょう,あってもよさそうなのに。
> chop -> init
ありがとう。では直しておきます。
f n xs = (iterate init $ map (take n) $ tails xs) !! n
これは無限リストで大丈夫ですね。
> 新しい良いアイディアが含まれていなかったり、
> 明らかに良くない方法だったりするものを
> 無闇に書き込むのは止めないか?(せめて欠点を併記するとか)
欠点を併記するというのはいいですね。でも,今まで前を拾うこ
とばかりしいたから,今度は後ろを落としてみたらどうかという
発想なので「無闇に」というのとは違いますよ。
0076デフォルトの名無しさん
NGNG手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。
007774
NGNG> 発想なので「無闇に」というのとは違いますよ。
失礼。
あなただけに書いたわけではなくて、>>70-71などを指していた。
> 「関数のn乗」
(iterate f x) !! n が普通なんだろうけど、
自分でtail recursiveな
nest :: (a -> b) -> a -> Int -> b
nest' :: (a -> b) -> a -> Int -> b -- strict
あたりを書いたほうが、速くていいね。
標準にあったほうがいいというのに同意。
> 手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。
foldlは無駄な処理をするのでまずい。
composition f n = foldr (.) id $ replicate n f
あたりか。
007974
NGNGnest :: (a -> a) -> a -> Int -> a
だね。
0080デフォルトの名無しさん
NGNG> 標準にあったほうがいいというのに同意。
ですよね。標準でないのは f^n は複数の n に対して評価する
可能性があるのでリストにキャッシュしておけ,という主張か
とも思ったのですが。あっても悪くない気がします。
f n xs = (transpose $ map inits $ tails xs) !! n
(制限:n は xs のサイズ以下,無限リスト可)
0081デフォルトの名無しさん
NGNGHaskellのリストは一つの型しか保持できない。
しかし、複数の型であっても、その間に「関係」があれば、
それらの型をラップし、一つのリストにいれた上で使用することができる。
--------------
{-# OPTIONS -fglasgow-exts #-}
-- different types
data A = A String deriving Show
methA (A x) = length x
data B = B Int deriving Show
methB (B x) = x
-- but they have the methods of the same return type Int
data C = forall x. C x (x -> Int)
runC (C x f) = f x
testC = map runC [C (A "I am A") methA, C (B 100) methB]
-- if they belong to the same type class
data ShowC = forall x. (Show x) => ShowC x
instance Show ShowC where
show (ShowC x) = show x
testShowC = show [ShowC $ A "I am A", ShowC $ B 100]
-- nearly nonsense
data X = forall x. X x
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNGhttp://www.amazon.com/exec/obidos/tg/detail/-/0077093305/
久々の新刊かも
0085デフォルトの名無しさん
NGNG豪快に割引されてますな。
0086デフォルトの名無しさん
NGNGhttp://pc2.2ch.net/test/read.cgi/tech/1013846140/ #554
一年以上も前に。
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNGペーパーバックで5000円か…
0089デフォルトの名無しさん
NGNGできあがる実行ファイルがでかすぎる
0090デフォルトの名無しさん
NGNGMinimulコードでどれぐらい?
0091デフォルトの名無しさん
NGNG@ Mac OS X 10.3
--- Hello.hs
module Main where
import Graphics.UI.WX
main :: IO ()
main = start hello
hello :: IO ()
hello =
do
f <- frame [text := "Hello world!"]
quit <- button f [text := "Quit", on command := close f]
set f [layout := widget quit]
---
$ ghc -package wx -o hello Hello.hs
で、helloのサイズが7M強。
0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNG0094デフォルトの名無しさん
NGNGツールキット全部そんなかに入ってんじゃないの?
だったら仕方ねぇと思うけど。
外出しには出来ねぇのかな?
0095デフォルトの名無しさん
NGNGどうすればいいのだろう?
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGb) packageを持ってきてpkg_add
0098デフォルトの名無しさん
NGNG安定してきてリリースする間際にコンパイラに移行するの?
インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
Haskellってコンパイル撃遅い(というか長い)ッてきいたけどマジ?
0099デフォルトの名無しさん
NGNGGHC のコンパイルには GHC バイナリが必要です
>>97
ports や package は教育上入れてもらえない学生さんなんですよ
0100デフォルトの名無しさん
NGNGFreeBSD の ftp サーバの ports/distfiles に
ghc-<version>-i386-unknown-freebsd-boot.tar.bz2 があるからこれを展開して,
ghc のコンパイル時にこの展開先にある ghc を指定してコンパイルすればok.
ちなみに ports も同じことをしている(処理が自動化されてるだけ).
>>98
コンパイルはたしかに激遅.
プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.
0101デフォルトの名無しさん
NGNGhttp://www.sampou.org/haskell/report-revised-j/
0102デフォルトの名無しさん
NGNGそんなのちょこっとスクリプト走らせれば楽勝だろ?
0103デフォルトの名無しさん
NGNG> みんなまずインタプリタで開発して、
おれはそうしてる。GHCiでときどきHugsでチェック。
> インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
そんな経験は無い。
0104デフォルトの名無しさん
NGNGありがとう
試してみてうまくいったらまた報告します
0105デフォルトの名無しさん
NGNGもう今は昔の話なのかな?
0106デフォルトの名無しさん
NGNGScheme,OCaml,Haskell,Clean、覚えて「損しない」「一番得」
な言語はどれ。ぶっちゃけ周辺ライブラリーが充実してるのどれ。
0107デフォルトの名無しさん
NGNG得するのは、全部覚えること。
得しないのは、ひとつしか覚えないこと。
0108デフォルトの名無しさん
NGNG若いなら全部やれ
0109デフォルトの名無しさん
NGNGコンパイルは速いけどね。
Hugs/GHC共通のHierachical moduleの多くが使えないのが痛すぎる。
今試しに
main = interact id
をnhc98(FreeBSD-CURRENT, from ports)でコンパイルしたらbus error....
0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG統計やるならRが結構ナイスだ。
0112デフォルトの名無しさん
NGNGRスレはこっちに↓あ〜る
= 統計解析フリーソフト R =
http://science2.2ch.net/test/read.cgi/math/1062650510/
0113デフォルトの名無しさん
NGNGhttp://www.teu.ac.jp/kougi/koshida/Prog6/Text08/index.html
の問題1 ですが、
> sigma :: (Int -> Int) -> (Int -> Int)
> 上記の関数sigmaを,1) ラムダ記法を使って,2) 関数の部分適用を使って,定義せよ.ただし,sigma fは,自然数nに対して
> f 0 + f 1 + ... + f n
> を計算する関数とする.
lambda 版 は以下のように作成しました。
sigmaLambda :: (Int -> Int) -> (Int -> Int)
sigmaLambda f = \x -> sum [f i | i <- [0 .. x]]
で、部分適用版ですが、
sigma :: (Int -> Int) -> Int -> Int
sigma f 0 = f 0
sigma f n = sigma f (n-1) + f n
で、いいんでしょうか。
題意のような関数を返すのですが、部分適用という感じがしません。
出題者がどのような回答を期待しているか知りたいのですが。
(あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです)
0114デフォルトの名無しさん
NGNG> 題意のような関数を返すのですが、部分適用という感じがしません。
addNum'' n m = n + m に部分適用を使ったといっているのだからそれでいいだろう。
sigmaPartial f n = sum [f m | m <- [0..n]]
> (あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです)
それなら使わなければいいのでは?
sigmaLambda = \f n -> if n == 0 then f 0 else sigmaLambda f (n - 1) + f n
0115デフォルトの名無しさん
NGNGsigma f = \ n -> foldl (\ s i -> s + f i) 0 [0..n]
sigma' f = let iter s x = if x < 0 then s else iter (s+f x) (x-1) in iter 0
0116デフォルトの名無しさん
NGNGsigma = flip fix 0 $ \s t f n -> if n < 0 then t else s (t + f n) f (n - 1)
0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNGHaskell98でもIOモナドからthrowできる例外(IOError)があるし、
最近のGHC、Hugsでは普通の関数からも例外(Exception)をthrowできる。
catchはIOモナドの中でおこなう。
参照: Control.Exception
0120デフォルトの名無しさん
NGNG「モナドは継続渡しを提供する」という大雑把な理解でいいでしょうか?
・・・違うかな?
0121デフォルトの名無しさん
NGNG0122デフォルトの名無しさん
NGNG実際問題それ以上使うことはないからだろう。
Haskell 98 Report によると maxBound::Int は少なくとも 2^29-1。
(!!)のインデックスは0-originだから、長さ2^29のリストまで扱える。
これ以上の長さのリストを使う場面は……。
0123デフォルトの名無しさん
NGNG0124デフォルトの名無しさん
NGNG自分で最低義すれ。
0125デフォルトの名無しさん
NGNG円周率は全桁保持していなくても次を計算できたはず。
>>124
アドレスの制限があるから多くの計算機と既存の処理系では
再定義しても無駄。
0126デフォルトの名無しさん
NGNGttp://www.jaist.ac.jp/~kiyoshiy/writing/wadler_essenceoffunctionalprogramming.pdf
ここの資料はjaistのゼミ資料?
他にはHaskellDBが自分的に興味深い.
TorqueとかHibernateなんて目じゃない. Haskellだけど…
0127デフォルトの名無しさん
NGNGhaskell@でもちょうど議論されてるね。
上ででたものの他に、こういう意見があった。
Integer派:
* Lazyにcreated/destroyedなデータならアドレスの制限を
受けずに大きいものを利用できるはずだ。
* Intは一般的なケースへの最適化であり、
"Premature optimization is the root of all evil."
Integerには反対派:
Integerにするのは、巨大なリストという特殊な状況への最適化である。
(Integral b) => がよろしい。
0128デフォルトの名無しさん
NGNGオレもああいう凄腕Haskellerになりたい。
0129デフォルトの名無しさん
NGNGなんか凄いもの作ったの?
0130デフォルトの名無しさん
NGNG0131デフォルトの名無しさん
NGNGAranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
0132デフォルトの名無しさん
NGNGHaskell Support for the Eclipse IDE
http://eclipsefp.sourceforge.net/
0.3.0はEclipse最新var.(M9〜正式版)に対応しているぞ。
0133デフォルトの名無しさん
NGNGFudgets
http://www.cs.chalmers.se/Cs/Research/Functional/Fudgets/
触ってる人いる? これから弄ってみようと思うのだけど.
featureのページに,
Declarative flavour. While it is possible to enable GUI programming in
a functional language by providing an interface to an imperative GUI toolkit and,
in effect, using an imperative sub-language within the functional language,
Fudgets provide a declarative style of programming also for the construction of GUIs.
とある. なんだか期待大.
0134デフォルトの名無しさん
NGNG使えたら是非おしえてくれ。
Declarative GUI toolkitって数年前から
どれもメンテが止まってるっぽいんだよな。
最近ではwxHaskellがスタンダードになりつつあるけど、
やっぱりHaskellならDeclarativeにやりたい。
0135デフォルトの名無しさん
NGNGhttp://www.sampou.org/cgi-bin/cahier.cgi
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNG0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNG0140デフォルトの名無しさん
NGNGくやったと思うよ。
「わたしはもうループも書けなくなってしまって……」というのにワロタ。
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNG「Hello, worldもブラックボックス斬り」されてました。
0143デフォルトの名無しさん
NGNG関数型の haskellだ
短くて 簡潔で 理解しやすいコードを書けるぜ
って、言うじゃない
だけど
難しくて monad が理解できませんから
残念!
「Hello worldさえブラックボックス」
斬り
0144デフォルトの名無しさん
NGNG0145デフォルトの名無しさん
NGNGで済むから、コード自体は特に難しくは見えない。
ただ、入門者が Hello, World に到達するまでの過程が難しいんだよね……。
0146デフォルトの名無しさん
NGNGそのdoはいるの?
0147145
NGNGとだけ思ったのです。
main = do str <- getLine
putStr str
みたいに。
0148デフォルトの名無しさん
NGNGfact→fib→qsortあたりから入れば
得体の知れないモナドをとりあえず回避できる。
0149デフォルトの名無しさん
NGNGがんばってもせいぜい二分木
0150デフォルトの名無しさん
NGNG"Hindley-Milner" って、何て読むんでつか?
0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNG0153デフォルトの名無しさん
NGNG0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNGメール出して聞いたら?
ttp://www-maths.swan.ac.uk/staff/jrh/ J. Roger Hindley
ttp://www.cl.cam.ac.uk/~rm135/ Robin Milner
0157デフォルトの名無しさん
NGNGもちつけ
0158デフォルトの名無しさん
NGNGそりゃ当然、Cにする前にプログラム変換するだろ
それに大抵のCCには-foptimize-sibling-callsみたいなのがあるだろうし
0159デフォルトの名無しさん
NGNGユーザーレベルで言語をマスターするっつーのは、ある処理系を骨までしゃぶり
尽くすことだろ。リスパーのように自作こそ最強だが、複雑な言語ではそこまでは
まあ、なかなか出来るもんでもないしな。
GHCのことについて詳しい奴がいないのを見ると、誰もHaskellでまともに
プログラム書こうとしてないように見える。結局おまいらは、話のネタに
関数型言語を選んでるだけなんだよ。
0160デフォルトの名無しさん
NGNG0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNGAranskはいちゃもん言うだけでプログラムすら書かんだろ?
0163デフォルトの名無しさん
NGNGサンプルプログラムのBouncingBalls.hsでセグメンテーションフォールトが
起きます。(http://wxhaskell.sourceforge.net/quickstart.html)
プログラムを起動し、'p'などのアルファベットを入力することで生じます。
そこで小さなプログラムを作って試してみたのですが、
やはり同様な現象が起ります。
$ cat test.hs
import Graphics.UI.WX
main :: IO ()
main = start test
test :: IO ()
test = do f <- frame []
p <- panel f []
set f [layout := widget p]
set p [on(charKey 'a') := print "test ok"]
$ ghc -package wx test.hs -o test
$ ./test
(ここでキーボードの'a'を入力)
セグメンテーション違反です
環境
wxhaskellのバージョンは0.7
wxGTKのバージョンは2.4.2
OSはlinux
他の環境でもこのバグが再現するでしょうか。
0164デフォルトの名無しさん
NGNG特に問題発生せず
環境
wxHaskell 0.8
wxWidget 2.5.2
MacOS X 10.3
$ ghc -package wx test.hs -o test
$ /usr/local/wxhaskell/bin/macos-app -v test
できたtestをFinderからダブルクリックで起動
真っ白いパネルが出てくる
'a' 押すと「コンソール」に "test ok"
とりあえずバージョンアップしてみれば
0165デフォルトの名無しさん
NGNGどうもありがとうございます。
0166デフォルトの名無しさん
NGNGf (+) [1 2 3] [4 5 6] => [5 7 9]
■ このスレッドは過去ログ倉庫に格納されています