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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Haskellの公式HP
http://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 (´∀`) 'マターリ)NGNG
処理系が落ちてこないので、試さずに挑む。
f n xs = [[xs !! (x + y) | y <- [..n-1]] | x <- [..(length xs)-n]]
0068デフォルトの名無しさんNGNG
>>67
たぶん、
× [..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
>>68
しまった。
書き込んでから気付いたのだが、これだと
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 (´∀`) 'マターリ)NGNG
f n xs = take ((length xs)-n+1) [take n x | x <- tails xs]

f n xs = filter ((==n).length) [take n x | x <- tails xs]
0072デフォルトの名無しさんNGNG
>>70
>>44の#と一緒。
0073デフォルトの名無しさんNGNG
>>71
> 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
>>73
「関数のn乗」 -> ない。
chop -> init 

> f n xs = map (take n) $ chopn n $ tails xs
> ....
無限リストに使えん。

気持ちは分かるんだが、
    新しい良いアイディアが含まれていなかったり、
    明らかに良くない方法だったりするものを
無闇に書き込むのは止めないか?(せめて欠点を併記するとか)

他の初心者が無分別に使うかもしれないし、
いいアイディアのものが埋もれる。
中級者以上(?)には面白くないし。
0075デフォルトの名無しさんNGNG
>>74
> 「関数のn乗」 -> ない。

なぜないんでしょう,あってもよさそうなのに。

> chop -> init

ありがとう。では直しておきます。

f n xs = (iterate init $ map (take n) $ tails xs) !! n

これは無限リストで大丈夫ですね。

> 新しい良いアイディアが含まれていなかったり、
> 明らかに良くない方法だったりするものを
> 無闇に書き込むのは止めないか?(せめて欠点を併記するとか)

欠点を併記するというのはいいですね。でも,今まで前を拾うこ
とばかりしいたから,今度は後ろを落としてみたらどうかという
発想なので「無闇に」というのとは違いますよ。
0076デフォルトの名無しさんNGNG
> 「関数のn乗」
手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。
007774NGNG
>>75  
> 発想なので「無闇に」というのとは違いますよ。
失礼。
あなただけに書いたわけではなくて、>>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
あたりか。
007874NGNG
最後は>>76宛。
007974NGNG
なんどもすまん。
  nest :: (a -> a) -> a -> Int -> a
だね。
0080デフォルトの名無しさんNGNG
>>77
> 標準にあったほうがいいというのに同意。
ですよね。標準でないのは f^n は複数の n に対して評価する
可能性があるのでリストにキャッシュしておけ,という主張か
とも思ったのですが。あっても悪くない気がします。


f n xs = (transpose $ map inits $ tails xs) !! n
(制限:n は xs のサイズ以下,無限リスト可)
0081デフォルトの名無しさんNGNG
なんとなくテクニックの紹介をしてみる。

Haskellのリストは一つの型しか保持できない。
しかし、複数の型であっても、その間に「関係」があれば、
それらの型をラップし、一つのリストにいれた上で使用することができる。
--------------
{-# 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デフォルトの名無しさんNGNG
sage
0083デフォルトの名無しさんNGNG
GHC-6.2.1 released
0084デフォルトの名無しさんNGNG
Functional Programming With Haskell
http://www.amazon.com/exec/obidos/tg/detail/-/0077093305/

久々の新刊かも
0085デフォルトの名無しさんNGNG
>>84
豪快に割引されてますな。
0086デフォルトの名無しさんNGNG
前スレでガイシュツだったのか。
http://pc2.2ch.net/test/read.cgi/tech/1013846140/ #554
一年以上も前に。
0087デフォルトの名無しさんNGNG
wxHaskell使ってる人っている?
0088デフォルトの名無しさんNGNG
>>84
ペーパーバックで5000円か…
0089デフォルトの名無しさんNGNG
>>87
できあがる実行ファイルがでかすぎる
0090デフォルトの名無しさんNGNG
>>89
Minimulコードでどれぐらい?
0091デフォルトの名無しさんNGNG
>>90
@ 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デフォルトの名無しさんNGNG
stripして3M弱だな。
0093デフォルトの名無しさんNGNG
そりゃすげえな
0094デフォルトの名無しさんNGNG
よくしんねぇけど、
ツールキット全部そんなかに入ってんじゃないの?
だったら仕方ねぇと思うけど。
外出しには出来ねぇのかな?
0095デフォルトの名無しさんNGNG
GHC を ports の導入されていない FreeBSD に導入したいんだが
どうすればいいのだろう?
0096デフォルトの名無しさんNGNG
make install
0097デフォルトの名無しさんNGNG
a) portsを入れてmake install
b) packageを持ってきてpkg_add
0098デフォルトの名無しさんNGNG
みんなまずインタプリタで開発して、
安定してきてリリースする間際にコンパイラに移行するの?
インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
Haskellってコンパイル撃遅い(というか長い)ッてきいたけどマジ?
0099デフォルトの名無しさんNGNG
>>96
GHC のコンパイルには GHC バイナリが必要です

>>97
ports や package は教育上入れてもらえない学生さんなんですよ
0100デフォルトの名無しさんNGNG
>>99
FreeBSD の ftp サーバの ports/distfiles に
ghc-<version>-i386-unknown-freebsd-boot.tar.bz2 があるからこれを展開して,
ghc のコンパイル時にこの展開先にある ghc を指定してコンパイルすればok.

ちなみに ports も同じことをしている(処理が自動化されてるだけ).

>>98
コンパイルはたしかに激遅.
プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.
0101デフォルトの名無しさんNGNG
マニュアル印刷したいんだけど、1枚のHTMLにしてくんないかな。印刷しづらい。
http://www.sampou.org/haskell/report-revised-j/
0102デフォルトの名無しさんNGNG
>>101
そんなのちょこっとスクリプト走らせれば楽勝だろ?
0103デフォルトの名無しさんNGNG
>>98
> みんなまずインタプリタで開発して、
おれはそうしてる。GHCiでときどきHugsでチェック。

> インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
そんな経験は無い。
0104デフォルトの名無しさんNGNG
>>100
ありがとう

試してみてうまくいったらまた報告します
0105デフォルトの名無しさんNGNG
NHCの方が良質のコードを生成するって聞いたことあるけど、
もう今は昔の話なのかな?
0106デフォルトの名無しさんNGNG
このスレでも聞いてみる。
Scheme,OCaml,Haskell,Clean、覚えて「損しない」「一番得」
な言語はどれ。ぶっちゃけ周辺ライブラリーが充実してるのどれ。
0107デフォルトの名無しさんNGNG
>>106
得するのは、全部覚えること。
得しないのは、ひとつしか覚えないこと。
0108デフォルトの名無しさんNGNG
>>106
若いなら全部やれ
0109デフォルトの名無しさんNGNG
>>105
コンパイルは速いけどね。
Hugs/GHC共通のHierachical moduleの多くが使えないのが痛すぎる。

今試しに
main = interact id
をnhc98(FreeBSD-CURRENT, from ports)でコンパイルしたらbus error....
0110デフォルトの名無しさんNGNG
r抜けてたHierarchical
0111デフォルトの名無しさんNGNG
>>106
統計やるならRが結構ナイスだ。
0112デフォルトの名無しさんNGNG
>>110-111
Rスレはこっちに↓あ〜る

= 統計解析フリーソフト R =
http://science2.2ch.net/test/read.cgi/math/1062650510/
0113デフォルトの名無しさんNGNG
工科大の
http://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
>>113
> 題意のような関数を返すのですが、部分適用という感じがしません。
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デフォルトの名無しさんNGNG
sigma,sigma' :: (Int -> Int) -> (Int -> Int)
sigma 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デフォルトの名無しさんNGNG
import Control.Monad.Fix (fix) -- fix f = f (fix x)
sigma = flip fix 0 $ \s t f n -> if n < 0 then t else s (t + f n) f (n - 1)
0117デフォルトの名無しさんNGNG
fix f = f (fix f)ね。
0118デフォルトの名無しさんNGNG
Haskell に例外処理の機構はあるの?
0119デフォルトの名無しさんNGNG
ある。
Haskell98でもIOモナドからthrowできる例外(IOError)があるし、
最近のGHC、Hugsでは普通の関数からも例外(Exception)をthrowできる。
catchはIOモナドの中でおこなう。

参照: Control.Exception
0120デフォルトの名無しさんNGNG
Haskell勉強中なんですけど、
「モナドは継続渡しを提供する」という大雑把な理解でいいでしょうか?
・・・違うかな?
0121デフォルトの名無しさんNGNG
なんで Prelude で (!!) は Integer じゃなくて Int で定義されているの?
0122デフォルトの名無しさんNGNG
>>121
実際問題それ以上使うことはないからだろう。
Haskell 98 Report によると maxBound::Int は少なくとも 2^29-1。
(!!)のインデックスは0-originだから、長さ2^29のリストまで扱える。
これ以上の長さのリストを使う場面は……。
0123デフォルトの名無しさんNGNG
円周率の世界記録に朝鮮したい人はどうすれば?
0124デフォルトの名無しさんNGNG
>>123
自分で最低義すれ。
0125デフォルトの名無しさんNGNG
>>123
円周率は全桁保持していなくても次を計算できたはず。

>>124
アドレスの制限があるから多くの計算機と既存の処理系では
再定義しても無駄。
0126デフォルトの名無しさんNGNG
>>120 こんなん見つけた

ttp://www.jaist.ac.jp/~kiyoshiy/writing/wadler_essenceoffunctionalprogramming.pdf

ここの資料はjaistのゼミ資料?
他にはHaskellDBが自分的に興味深い.
TorqueとかHibernateなんて目じゃない. Haskellだけど…
0127デフォルトの名無しさんNGNG
>>121
haskell@でもちょうど議論されてるね。
上ででたものの他に、こういう意見があった。

Integer派:
*   Lazyにcreated/destroyedなデータならアドレスの制限を
    受けずに大きいものを利用できるはずだ。
*   Intは一般的なケースへの最適化であり、
    "Premature optimization is the root of all evil."

Integerには反対派:
    Integerにするのは、巨大なリストという特殊な状況への最適化である。
    (Integral b) => がよろしい。
0128デフォルトの名無しさんNGNG
Hanatani さんすげーな。
オレもああいう凄腕Haskellerになりたい。
0129デフォルトの名無しさんNGNG
>>128
なんか凄いもの作ったの?
0130デフォルトの名無しさんNGNG
しばらく見ないうちに「関数型言語」のスレがひどいことになってるな。
0131デフォルトの名無しさんNGNG
>>130
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
0132デフォルトの名無しさんNGNG
たま〜にはあげてみる

Haskell Support for the Eclipse IDE
http://eclipsefp.sourceforge.net/

0.3.0はEclipse最新var.(M9〜正式版)に対応しているぞ。
0133デフォルトの名無しさんNGNG
おお. しかしスクリーンショットがほしい所かも. 後でインスコしてみるか…

Fudgets
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
>>133
使えたら是非おしえてくれ。
Declarative GUI toolkitって数年前から
どれもメンテが止まってるっぽいんだよな。

最近ではwxHaskellがスタンダードになりつつあるけど、
やっぱりHaskellならDeclarativeにやりたい。
0135デフォルトの名無しさんNGNG
Haskell Marathon
http://www.sampou.org/cgi-bin/cahier.cgi
0136デフォルトの名無しさんNGNG
Haskell で Marathon を実装するのかとオモタ。
0137デフォルトの名無しさんNGNG
マラソン参加してみようかな。入門ページ読んだくらいで準備はよいだろうか
0138デフォルトの名無しさんNGNG
マラソン直前に台風直撃の悪寒
0139デフォルトの名無しさんNGNG
LL WeekendでのHaskellに対する聴衆の感想は「Haskellのコードはよくわからない」というのが多かったみたいでつね
0140デフォルトの名無しさんNGNG
5分だか7分だかでわかれという方が無理があるという話がある。発表者陣はよ
くやったと思うよ。
「わたしはもうループも書けなくなってしまって……」というのにワロタ。
0141デフォルトの名無しさんNGNG
LL侍はHaskellを斬ったの?
0142デフォルトの名無しさんNGNG
>>141
「Hello, worldもブラックボックス斬り」されてました。
0143デフォルトの名無しさんNGNG
おれはhaskell haskell haskellだ
関数型の haskellだ
短くて 簡潔で 理解しやすいコードを書けるぜ
って、言うじゃない

だけど
難しくて monad が理解できませんから

残念!
「Hello worldさえブラックボックス」
斬り
0144デフォルトの名無しさんNGNG
むしろHello, worldだから難しいような気がする
0145デフォルトの名無しさんNGNG
main = do putStr "Hello, World!"

で済むから、コード自体は特に難しくは見えない。
ただ、入門者が Hello, World に到達するまでの過程が難しいんだよね……。
0146デフォルトの名無しさんNGNG
>>145
そのdoはいるの?
0147145NGNG
この場合はいらないけど、先々のことを考えたら入れた方がいいかな、とちょっ
とだけ思ったのです。
main = do str <- getLine
putStr str
みたいに。
0148デフォルトの名無しさんNGNG
いきなりIOから入るのがまずい。
fact→fib→qsortあたりから入れば
得体の知れないモナドをとりあえず回避できる。
0149デフォルトの名無しさんNGNG
再帰とリスト処理しかできないHaskellちゃん
がんばってもせいぜい二分木
0150デフォルトの名無しさんNGNG
膣門です。
"Hindley-Milner" って、何て読むんでつか?
0151デフォルトの名無しさんNGNG
誰か「モナドだけで書く Haskell プログラミング」を書いてくれい
0152デフォルトの名無しさんNGNG
>>151 Cでも使ってれば?
0153デフォルトの名無しさんNGNG
そういやHaskellのコンパイルはC経由なんだよね
0154デフォルトの名無しさんNGNG
末尾再帰の保証とかC経由じゃ無理だろ
0155デフォルトの名無しさんNGNG
GHCで最適化オプション付けるとCのコード吐くんじゃなかったっけ?
0156デフォルトの名無しさんNGNG
>>150
メール出して聞いたら?
ttp://www-maths.swan.ac.uk/staff/jrh/ J. Roger Hindley
ttp://www.cl.cam.ac.uk/~rm135/ Robin Milner
0157デフォルトの名無しさんNGNG
>>156
もちつけ
0158デフォルトの名無しさんNGNG
>>154
そりゃ当然、Cにする前にプログラム変換するだろ
それに大抵のCCには-foptimize-sibling-callsみたいなのがあるだろうし
0159デフォルトの名無しさんNGNG
レベル低いな。っつってもHaskellのことは何も知らないのであれなんだが。。。
ユーザーレベルで言語をマスターするっつーのは、ある処理系を骨までしゃぶり
尽くすことだろ。リスパーのように自作こそ最強だが、複雑な言語ではそこまでは
まあ、なかなか出来るもんでもないしな。
GHCのことについて詳しい奴がいないのを見ると、誰もHaskellでまともに
プログラム書こうとしてないように見える。結局おまいらは、話のネタに
関数型言語を選んでるだけなんだよ。
0160デフォルトの名無しさんNGNG
↑Aransk?
0161デフォルトの名無しさんNGNG
Simon Peyton Jones は C-- もやってるのに、自前でオプティマイズ出来ないってのは意外。
0162デフォルトの名無しさんNGNG
>160
Aranskはいちゃもん言うだけでプログラムすら書かんだろ?
0163デフォルトの名無しさんNGNG
wxhaskellについてですが、
サンプルプログラムの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
>>163
特に問題発生せず

環境
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
wxHaskellを0.8にバージョンアップしたら問題は解決しました。
どうもありがとうございます。
0166デフォルトの名無しさんNGNG
このような関数はどう書けばいいんでしょうか?

f (+) [1 2 3] [4 5 6] => [5 7 9]
■ このスレッドは過去ログ倉庫に格納されています