[表示 : 全て 最新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

2 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:17]
過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/

関数型言語
Part1 pc.2ch.net/tech/kako/987/987954395.html
Part2 pc3.2ch.net/tech/kako/1007/10073/1007387924.html
Part3 pc2.2ch.net/test/read.cgi/tech/1037527388/l50

純粋関数型言語Concurent Clean
pc2.2ch.net/test/read.cgi/tech/1075629340/l50

ML!!!!!!
pc.2ch.net/tech/kako/1002/10021/1002111468.html
関数型プログラミング言語ML
Part1 pc2.2ch.net/tech/kako/1012/10124/1012445015.html
Part2 pc2.2ch.net/test/read.cgi/tech/1058630709/l50

3 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:17]
CommonLisp Scheme MacLisp ....
Part1: piza2.2ch.net/tech/kako/987/987169286.html
Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: ruku.qp.tc/dat2ch/0311/20/1042167213.html
Part8: pc2.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: pc2.2ch.net/test/read.cgi/tech/1075630259/l50

CommonLisp初心者スレ
pc2.2ch.net/test/read.cgi/tech/1075464728/l50

Emacs Lisp
Part1 pc2.2ch.net/test/read.cgi/tech/1004551074/
Part2 pc2.2ch.net/test/read.cgi/tech/1068467385/l50

4 名前:デフォルトの名無しさん [04/02/10 22:23]
4

5 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:24]
5までいってないけど書き込んでもいいのかな?
>>1乙。
# MLスレの571他です。

6 名前:MLスレ662 mailto:sage [04/02/10 22:27]
>>5
関数スレ見たらもう張るものもないので

7 名前:デフォルトの名無しさん mailto:sage [04/02/10 23:19]
>>1
otu!

8 名前:デフォルトの名無しさん mailto:sage [04/02/11 00:46]
Control.Exception にある catch や try や handle って IO a の型がからんでくるから、IO 関係ないとこだと使えないよね。
IO 関係ない関数での引数が気に入らないとかのエラー処理は、Maybe でやるのが Hakell 流なんでしょうか?
それとも容赦なく error が使っちまうべきなんだろうか?


9 名前:デフォルトの名無しさん mailto:sage [04/02/11 00:52]
>>8
>  IO 関係ない関数での引数が気に入らないとかのエラー処理は、Maybe でやるのが Hakell 流なんでしょうか?
Yes.  Maybeがモナドであることの有難味がわかるよ。

10 名前:デフォルトの名無しさん mailto:sage [04/02/11 09:26]
>>9
Maybe だといちいち Just か Nothing か判定して、
fromJust とかしいといけないから、めんどうだと思ったんだけど。
いまいち自分が Maybe を理解してない気もするな。

> Yes. Maybeがモナドであることの有難味がわかるよ。
その有難味を具体的に教えてください。




11 名前:デフォルトの名無しさん mailto:sage [04/02/11 12:29]
>>10
例えば
-- f, g x, h xのいづれかがNothingを返したとき、value_in_error_caseを返す。
(f >>= g >>= h) `maybeCatch` value_in_error_case

ここで
maybeCatch = flip . fromMaybe
# ヒントをもらったら答えを聞く前に自分で考えてみるようにしたほうがいいと思う。

しかし、本当に
>  引数が気に入らない
が問題だというなら、より正しい対処は(適切な抽象型をもちいるなどして)
そんなことがおこらないようにすること。
何か計算の結果が不確定である場合はしかたがないが。

アボートしていいプログラムやassertionならそもそもIOでのcatchもtryもいらない。
errorでいいし、時にはパターンマッチの失敗だけでいい。
f x | validity_check x = ...

12 名前:デフォルトの名無しさん mailto:sage [04/02/11 18:55]
>>10
> その有難味を具体的に教えてください。
いちいち Just か Nothing か判定したり、
fromJust とかしなくていいところ。

13 名前:デフォルトの名無しさん mailto:sage [04/02/11 20:52]
そっか、すぐ Maybe 外すことばかり考えていたけど、
(Just x) >>= k = k x
Nothing >>= _ = Nothing
とかで、気にせず Maybe 付いたままでいけばいいんだね。
どうもありがとう。


14 名前:デフォルトの名無しさん [04/02/13 07:34]
>>11
小さなことだけど。
× flip . fromMaybe ○ flip fromMaybe
ですよね。

15 名前:デフォルトの名無しさん mailto:sage [04/02/15 18:09]
OO 言語だと、最初は大体 bank accounts の説明から始まりますよね。
Haskell で bank accounts を実装するとどうなるのでしょうか。

16 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:03]
>>15
bank accountsと一口にいわれてもよくわからないが…
こういうこと(カプセル化)でないなら、
期待しているものが載ってるURLをくれ。

ポリモルフィズムはtype class。
継承は難しい。
# OOA, OODが全てではない。

-- テストしてない
module BankAccount (
    -- Do not export any constructor.
    name, money, newAccount
    --, query, ...etc
    ) where

data Account = Account String Integer
name (Account s m) = s
money (Account s m) = m
newAccount (s, m) = Account s m

-- data Database = Database [Account]
-- query (Database as) nm = filter ((== nm).name) as

17 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:16]
>>15
> OO 言語だと、最初は大体 bank accounts の説明から始まりますよね。
考えが古典的過ぎるのでは?

C の構造体がどうのこうのとか。


18 名前:デフォルトの名無しさん mailto:sage [04/02/15 20:04]
>>16
こういうのをお願いします。アカウントを複数作れて、それぞれに withdraw, deposit
可能な感じです。

mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html#%_sec_3.1.1

>>17
状態遷移を扱う例が他に思いつかなかったもので。OO かどうかにはこだわっていません。

19 名前:デフォルトの名無しさん mailto:sage [04/02/15 21:33]
>>18
depositだけ実装。

どうしても
> (withdraw 25)
> 75
> (withdraw 25)
> 50
こんなことがしたい、という意味?

それとも、こういう機能があればいいのか?
例:
$ ./a.out
Print
>> Status: [(0,100),(1,1000),(2,300)]
Deposit 1 300
Deposit 2 400
Print
>> Status: [(0,100),(1,1300),(2,700)]
^D

前者なら、
make_withdraw :: IORef Account -> Money -> IO Money
make_withdraw ref money = 
    do {x <- readIORef ref; writeIORef ref (x - money); readIORef ref}

というのを作っておいて、
ref_account <- newIORef newAccount
let withdraw = make_withdraw ref_account -- :: Money -> IO Money
とする。

後者なら、普通は前者のような設計はしない。

20 名前:19 mailto:sage [04/02/15 21:34]
>>19
一行目は編集ミスなので無視してくれ。



21 名前:デフォルトの名無しさん mailto:sage [04/02/15 21:44]
>>19
× make_withdraw :: IORef Account -> Money -> IO Money
○ make_withdraw :: IORef Money -> Money -> IO Money

22 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:27]
>>19
どうもありがとうございます。
毎回出力する必要は無いので、後者だと思います。

23 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:46]
>>22
>  毎回出力する必要は無いので、後者だと思います。

なんかずれてるような。
> (withdraw 25)
> 75
> (withdraw 25)
> 50
このwithdrawは(同じ引数に対して別の値をかえすので)
関数じゃないというのはわかってる?

だから、
withdraw :: Int -> Int
ではなくて
withdraw :: Int -> IO Int
になる。別にIO Intにしたからって毎回出力するわけじゃないよ。

24 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:53]
>>22
depositだけ実装。
============================
module Main where
import Data.FiniteMap
import Data.Maybe
type Database = FiniteMap Int Int
-- errors are silently ignored.
deposit :: Database -> (Int, Int) -> Database
deposit db (nm, mon)
    = fromMaybe db (lookupFM db nm >>= return . addToFM db nm . (+ mon))
testDB :: Database
testDB = listToFM [(0, 100), (1,1000), (2, 300)]

data Cmd = Deposit Int Int | Withdraw Int Int | Print | Error
  deriving Read

============================
続く

25 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:54]
============================
main = loop testDB
  where
    loop db = do  s <- getLine
                  cmd <- catch (readIO s) (\e -> return Error)
                  case cmd of 
                    Deposit i m ->  do  loop $ deposit  db (i, m)
                    Print ->  do  putStrLn $ ">> Status: " ++ show (fmToList db)
                                  loop db
                    _ ->  do  putStrLn ">> Sorry, not implemented"
                              loop db
============================
終わり

26 名前:デフォルトの名無しさん mailto:sage [04/02/16 21:05]
>>23
どうもありがとうございます。

>このwithdrawは(同じ引数に対して別の値をかえすので)
>関数じゃないというのはわかってる?

なるほど。感覚的に難しいですね。頂いたコードはじっくり読ませて頂きます。
初心者なもので、時間がかかりそうですが。

27 名前:デフォルトの名無しさん mailto:sage [04/02/17 00:04]
HaskellにLispの疑似関数型プログラミング感覚を持ち込むとはまる罠

28 名前:デフォルトの名無しさん mailto:sage [04/02/18 09:12]
Haskell の短めのサンプルコードがたくさん解説されたり、アーカイブでまとめられている
サイトはありますか?

29 名前:デフォルトの名無しさん mailto:sage [04/02/18 10:04]
The Haskell School of Expression

30 名前:デフォルトの名無しさん mailto:sage [04/02/18 22:41]
>>28
rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=Haskell

UNIXコマンドのHaskellでの実装が多数あります。
というか、僕が書いたものが多いですが。
wikiなので勝手に書きこんじゃいました。
解説はしてませんが、短いコードが多いです。
参考になればうれしいです。
それと、メール欄にsageと書いておくことをようやく学びました。



31 名前:デフォルトの名無しさん mailto:sage [04/02/18 23:15]
>>28
Preludeの関数を書く、ついてくるPreludeを読むのがお薦め。

32 名前:デフォルトの名無しさん mailto:sage [04/02/18 23:31]
>>30のリンクをみて。

uniq 改良版(getArgs...はかわらないのでstdin用)
--
import Data.List
main = interact $ unlines . map head . group . lines
--

basename, wcあたりも面白そうだ。

33 名前:デフォルトの名無しさん mailto:sage [04/02/19 06:01]
>>32
やられた。
そうか、groupが使えたか。
ちょっと悔しいな。
改良版も加えておきます。

34 名前:28 mailto:sage [04/02/19 11:04]
皆さんありがとうございます。
いろいろなコードをちまちまハックしたいと思います。

Haskell はまだリファレンスだけでは全くかけないので。

35 名前:デフォルトの名無しさん mailto:sage [04/02/19 12:48]
a = [0, 1, 2, 3, 4] てなリストがあったとき、
f 3 a => [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
といった値を返す関数 f が欲しいのですが、
Haskell に標準であるでしょうか?

36 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:33]
List.hsとPrelude.hsを探したけど、無かった。
無いとは言いきれないけどね。
いちおうお求めの関数は
f :: Int -> [a] -> [[a]]
f num lst
| length lst >= num = take num lst : f num (tail lst)
| otherwise = []
でいいとは思います。

37 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:41]
あ、インデントが。
f num lst以下の2文はインデントを深くしないと、だめです。
いちおう念のため。

38 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:57]
myTakeを定義しておいて、(長さが足りないとNothing)

g :: Int -> [a] -> [[a]]
g num lst = mapMaybe (myTake num) (tails lst)

これだとlst >> numでもOK

39 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:01]
myTake :: Int -> [a] -> Maybe [a]
myTake n _ | n < 0 = Nothing
myTake n _ | n == 0 = Just []
myTake n (x:xs) = case myTake (n-1) xs of
Just xxs -> Just (x:xxs)
Nothing -> Nothing
myTake _ [] = Nothing

40 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:37]
takeMaybe :: Int -> [a] -> Maybe [a]
takeMaybe n []
| n == 0 = Just []
| otherwise = Nothing
takeMaybe n (x:xs)
| n < 0 = Nothing
| n == 0 = Just []
| otherwise = takeMaybe (n-1) xs >>= \r
-> Just (x:r)





41 名前:デフォルトの名無しさん mailto:sage [04/02/19 16:59]
>>30 wc.hs 書いてる人につっこみ。
data は複数形、単数は datum.

-- 知っててやってるんだったら無視して下さい。
-- (data って変数名使えないから、とか。)

あと下から4行目の data は datas の typo でしょう。


42 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:00]
こんなのでもいいかも。

import List
h num lst = [ take num x | x <- tails lst, length x >= num ]

i num = map (take num) . filter ((>=num) . length) . tails

43 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:03]
だんだんエレガントにしようとするところが関数型言語スレらしいな。
#############################
import Data.Maybe
-- 再帰で書いてみた
f n xs = catMaybes $ f' n xs
    where   
        f' n [] = []
        f' n xxs@(x:xs) = (takeJust n xxs):f' n xs

-- AKA myTake and takeMaybe
takeJust 0 xs = Just []
takeJust n [] = Nothing
takeJust n (x:xs) = takeJust (n - 1) xs >>= \xs -> Just (x:xs)

44 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:12]
>>42
>>36(無限リストにつかえない、何度もlengthを求める)よりは
いいけど、takeとlengthを両方使うのは無駄がおおいのでいまいちかと。

-- テストしてない。多分遅い。
h num lst = filter ((== n) . length) $ f' num lst 
  where 
    f' num [] = []
    f' num lst = take num lst:f' num (tail lst)

45 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:15]
>>44
訂正
  >>36(無限リストにつかえない、何度もlengthを求める)よりは
と同じだね。

46 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:22]
>>41
そうか、そういえばそうだったな。
datasなんて単語はないのか。
指摘してくれてありがとう。
ま、いまのところは和製英語ってことで...。
そのうち直します。
日本人だと変数名には苦労するよね。

タイプミスは直しておきました。

47 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:42]
>>44
なるほど。
lengthを軽々しく使わないほうがいいのかもな。
じゃあ、こんなので

j num = map (take num) . filter (biggerOrEqual num) . tails

biggerOrEqual :: Int -> [a] -> Bool
biggerOrEqual 0 _ = True
biggerOrEqual n [] = False
biggerOrEqual n (x:xs) = biggerOrEqual (n-1) xs

48 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:05]
>>47
無限リスト対応問題のほうはそれでいけるね。

>  biggerOrEqual :: Int -> [a] -> Bool
こういうのが欲しくなることは結構ある。おれは
大体再帰で頭を落としていくようにくむから、[]との比較ですむけど。
書くならこうかな。

biggerOrEqual n xs = [] /= drop n xs

49 名前:48 mailto:sage [04/02/19 18:08]
biggerOrEqual  -> longerThan

50 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:14]
longerThan だと Equal が含まれないよ。




51 名前:48 mailto:sage [04/02/19 18:21]
>>50
だからそうかえたんだよ。

52 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:26]
>>48
なるほど、dropはnが大きすぎると[]を返すんだね。
きれいなやりかただ。

で、35の関数はわかりやすさと効率を考えると
以下のものがいいということになる?

38とほぼ同じ。少し見やすくしてみた。
効率がいいのはこれなのかな。
それとnum < 0のときはデフォルトのエラーを起こすようにした。

k num = mapMaybe (takeOfMine num) . tails

takeOfMine 0 _ = Just []
takeOfMine n [] = Nothing
takeOfMine n (x:xs) = maybe Nothing (Just . (x:)) $ takeOfMine (n-1) xs

53 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:39]
>>52
そんなもんかな。
# 個人的にはtakeOfMineは>>43のtakeJustのほうが
# Haskellらしくて好きだけどね。(48 == 43だったりする:-)

54 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:02]
>>53
Maybe Monadってやつね。
僕も好きだな。
でもこっちのほうが好き。

takeJust n (x:xs) = do xs <- takeJust (n-1) xs
return (x:xs)

なんか手続き型言語に擬態してるかんじが好き。

55 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:08]
なんだろ、インデントが重要な言語だと、困るよね。
どうしたらいいんだろう。
上の例ではreturn (x:xs)はxs <- takeJust ...にきっちり合わせないとエラー。

56 名前:by Chalice mailto:sage [04/02/19 19:30]
>>55
> なんだろ、インデントが重要な言語だと、困るよね。
いや、困らん。
…でも困る人は{...;..;.}って書けばいい。

とここまでかいて、他の人はIEとかで
プロポーショナルフォントでみているのだと気づいた。困るかも。

57 名前:デフォルトの名無しさん [04/02/19 21:47]
k 0 がポイント:

k 0 xs = [[]] ++ [[]|x <- xs]
k n xs = [x:y|(x,y) <- zip xs (k (n-1) (tail xs))]

58 名前:デフォルトの名無しさん mailto:sage [04/02/19 22:00]
>>56
  インデントを掲示板でちゃんと表示できたらいいと思ったからさ。

> takeJust n (x:xs) = do xs <- takeJust (n-1) xs
> return (x:xs)

こう書けばいいのかな。

59 名前:デフォルトの名無しさん mailto:sage [04/02/19 23:27]
>> 57
同じトピック内で同名関数が定義されたため、参照透明性が破られてしまいますた。

は冗談として、
m 1 xs = [[x] | x <- xs]
m n xs = [x:xs | (x,xs) <- zip xs $ m (n-1) $ tail xs]
でどうだろう。

60 名前:デフォルトの名無しさん mailto:sage [04/02/20 06:33]
>>57,59
かなりきれいな解法だと思う。
いままでで一番いいかも。



61 名前:デフォルトの名無しさん [04/02/20 13:47]
>>59
いや,f 0 にはそれなりの根拠があるので生かしておいて

f n [] = []
f n xxs@(x:xs) = top n xxs ++ f n xs
top 0 xs = [[]]
top n [] = []
top n (x:xs) = map (x:) $ top (n-1) xs

62 名前:デフォルトの名無しさん [04/02/20 13:52]
xxs@(x:xs)は不要なパターンでした

f n [] = []
f n xs = top n xs ++ f n (tail xs)
top 0 xs = [[]]
top n [] = []
top n (x:xs) = map (x:) $ top (n-1) xs


63 名前:デフォルトの名無しさん mailto:sage [04/02/20 16:24]
>>61
take* n ≒ top だね。map, ++ の使いかたあたりが微妙に遅そうにみえる。
>>57が綺麗でよさそう。
#  k 0 xs = []:[[]|x <- xs]
#  k n xs = zipWith (:) xs (k (n-1) (tail xs))

64 名前:デフォルトの名無しさん [04/02/20 16:29]
zipWith ... 忘れていたよ。


65 名前:35 mailto:sage [04/02/20 17:03]
>>36-64 みなさまありがとうございますm(_ _)m
私じゃぜんぜん思いつかないエレガントな解で、惚れ惚れいたしました。

66 名前:デフォルトの名無しさん [04/02/21 16:44]
どういたしまして。もう一つ:

f n xs = zipN $ take n $ tails xs
zipN xss = if any null xss then [] else map head xss : zipN (map tail xss)

ただし f 0 xs で暴走。

67 名前:(define (´∀`) 'マターリ) mailto:sage [04/02/22 10:08]
処理系が落ちてこないので、試さずに挑む。
f n xs = [[xs !! (x + y) | y <- [..n-1]] | x <- [..(length xs)-n]]

68 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:23]
>>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を両方使ってるあたりが泥臭いかも。
無限配列を扱えるもののなかで最も素直な解だと思う。どうかな。

69 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:38]
>>68
しまった。
書き込んでから気付いたのだが、これだと
p :: Eq a => Int -> [a] -> [[a]]
になってしまう。
まあ、素直な解ということで許してほしい。

70 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:53]
もうひとつ素直な解を。

# q n = filter ((==n).length) . k n
# where k _ [] = []
# k n xs = take n xs : k n (tail xs)

どうだろう。



71 名前:(define (´∀`) 'マターリ) mailto:sage [04/02/22 12:31]
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]

72 名前:デフォルトの名無しさん mailto:sage [04/02/22 17:17]
>>70
>>44の#と一緒。

73 名前:デフォルトの名無しさん [04/02/22 17:48]
>>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)


74 名前:デフォルトの名無しさん mailto:sage [04/02/22 18:12]
>>73
「関数のn乗」 -> ない。
chop -> init 

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

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

他の初心者が無分別に使うかもしれないし、
いいアイディアのものが埋もれる。
中級者以上(?)には面白くないし。

75 名前:デフォルトの名無しさん [04/02/22 18:59]
>>74
> 「関数のn乗」 -> ない。

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

> chop -> init

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

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

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

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

欠点を併記するというのはいいですね。でも,今まで前を拾うこ
とばかりしいたから,今度は後ろを落としてみたらどうかという
発想なので「無闇に」というのとは違いますよ。

76 名前:デフォルトの名無しさん mailto:sage [04/02/22 19:20]
> 「関数のn乗」
手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。

77 名前:74 mailto:sage [04/02/22 20:18]
>>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
あたりか。

78 名前:74 mailto:sage [04/02/22 20:18]
最後は>>76宛。

79 名前:74 mailto:sage [04/02/22 20:19]
なんどもすまん。
  nest :: (a -> a) -> a -> Int -> a
だね。

80 名前:デフォルトの名無しさん [04/02/23 21:34]
>>77
> 標準にあったほうがいいというのに同意。
ですよね。標準でないのは f^n は複数の n に対して評価する
可能性があるのでリストにキャッシュしておけ,という主張か
とも思ったのですが。あっても悪くない気がします。


f n xs = (transpose $ map inits $ tails xs) !! n
(制限:n は xs のサイズ以下,無限リスト可)



81 名前:デフォルトの名無しさん mailto:sage [04/02/29 06:43]
なんとなくテクニックの紹介をしてみる。

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

82 名前:デフォルトの名無しさん mailto:sage [04/03/03 22:00]
sage

83 名前:デフォルトの名無しさん [04/03/23 15:38]
GHC-6.2.1 released

84 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:23]
Functional Programming With Haskell
www.amazon.com/exec/obidos/tg/detail/-/0077093305/

久々の新刊かも

85 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:46]
>>84
豪快に割引されてますな。


86 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:49]
前スレでガイシュツだったのか。
pc2.2ch.net/test/read.cgi/tech/1013846140/ #554
一年以上も前に。

87 名前:デフォルトの名無しさん mailto:sage [04/03/24 12:00]
wxHaskell使ってる人っている?

88 名前:デフォルトの名無しさん mailto:sage [04/03/24 16:27]
>>84
ペーパーバックで5000円か…

89 名前:デフォルトの名無しさん mailto:sage [04/03/25 06:54]
>>87
できあがる実行ファイルがでかすぎる

90 名前:デフォルトの名無しさん mailto:sage [04/03/30 23:30]
>>89
Minimulコードでどれぐらい?



91 名前:デフォルトの名無しさん mailto:sage [04/03/31 02:56]
>>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強。

92 名前:デフォルトの名無しさん mailto:sage [04/03/31 17:53]
stripして3M弱だな。

93 名前:デフォルトの名無しさん mailto:sage [04/04/03 19:31]
そりゃすげえな

94 名前:デフォルトの名無しさん [04/04/03 19:37]
よくしんねぇけど、
ツールキット全部そんなかに入ってんじゃないの?
だったら仕方ねぇと思うけど。
外出しには出来ねぇのかな?

95 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:00]
GHC を ports の導入されていない FreeBSD に導入したいんだが
どうすればいいのだろう?

96 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:11]
make install

97 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:13]
a) portsを入れてmake install
b) packageを持ってきてpkg_add


98 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:47]
みんなまずインタプリタで開発して、
安定してきてリリースする間際にコンパイラに移行するの?
インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
Haskellってコンパイル撃遅い(というか長い)ッてきいたけどマジ?

99 名前:デフォルトの名無しさん mailto:sage [04/04/07 22:07]
>>96
GHC のコンパイルには GHC バイナリが必要です

>>97
ports や package は教育上入れてもらえない学生さんなんですよ

100 名前:デフォルトの名無しさん mailto:sage [04/04/08 14:25]
>>99
FreeBSD の ftp サーバの ports/distfiles に
ghc-<version>-i386-unknown-freebsd-boot.tar.bz2 があるからこれを展開して,
ghc のコンパイル時にこの展開先にある ghc を指定してコンパイルすればok.

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

>>98
コンパイルはたしかに激遅.
プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.








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

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

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