関数型プログラミング言語Haskell Part3 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
04/02/10 22:16
Haskellの公式HP
URLリンク(www.haskell.org)
日本語サイト
URLリンク(www.sampou.org)
HURLリンク(www.teu.ac.jp)

過去ログ、関連スレは>>2-5

2:デフォルトの名無しさん
04/02/10 22:17
過去ログ
関数型プログラミング言語Haskell
Part1 URLリンク(pc.2ch.net)
Part2 スレリンク(tech板)

関数型言語
Part1 URLリンク(pc.2ch.net)
Part2 URLリンク(pc3.2ch.net)
Part3 スレリンク(tech板)l50

純粋関数型言語Concurent Clean
スレリンク(tech板)l50

ML!!!!!!
URLリンク(pc.2ch.net)
関数型プログラミング言語ML
Part1 URLリンク(pc2.2ch.net)
Part2 スレリンク(tech板)l50

3:デフォルトの名無しさん
04/02/10 22:17
CommonLisp Scheme MacLisp ....
Part1: URLリンク(piza2.2ch.net)
Part2: URLリンク(pc.2ch.net)
Part3: URLリンク(pc.2ch.net)
Part4: URLリンク(pc.2ch.net)
Part5: URLリンク(pc3.2ch.net)
Part6: URLリンク(pc3.2ch.net)
Part7: URLリンク(ruku.qp.tc)
Part8: URLリンク(pc2.2ch.net)
Part9: スレリンク(tech板)
Part10: スレリンク(tech板)l50

CommonLisp初心者スレ
スレリンク(tech板)l50

Emacs Lisp
Part1 スレリンク(tech板)
Part2 スレリンク(tech板)l50

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

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

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

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

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


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

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

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


11:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/11 18:55
>>10
> その有難味を具体的に教えてください。
いちいち Just か Nothing か判定したり、
fromJust とかしなくていいところ。

13:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/15 18:09
OO 言語だと、最初は大体 bank accounts の説明から始まりますよね。
Haskell で bank accounts を実装するとどうなるのでしょうか。

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

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


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

URLリンク(mitpress.mit.edu)

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

19:デフォルトの名無しさん
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
04/02/15 21:34
>>19
一行目は編集ミスなので無視してくれ。

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

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

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

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

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

24:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/16 21:05
>>23
どうもありがとうございます。

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

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

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

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

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

30:デフォルトの名無しさん
04/02/18 22:41
>>28
URLリンク(rwiki.jin.gr.jp)

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

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

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

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

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

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

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

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

35:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/19 14:41
あ、インデントが。
f num lst以下の2文はインデントを深くしないと、だめです。
いちおう念のため。

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

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

これだとlst >> numでもOK

39:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/19 16:59
>>30 wc.hs 書いてる人につっこみ。
data は複数形、単数は datum.

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

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


42:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/19 17:15
>>44
訂正
  >>36(無限リストにつかえない、何度もlengthを求める)よりは
と同じだね。

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

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

47:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/19 18:05
>>47
無限リスト対応問題のほうはそれでいけるね。

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

biggerOrEqual n xs = [] /= drop n xs

49:48
04/02/19 18:08
biggerOrEqual  -> longerThan

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


51:48
04/02/19 18:21
>>50
だからそうかえたんだよ。

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

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

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

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

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

56:by Chalice
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:デフォルトの名無しさん
04/02/19 22:00
>>56
  インデントを掲示板でちゃんと表示できたらいいと思ったからさ。

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

こう書けばいいのかな。

59:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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
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 (´∀`) 'マターリ)
04/02/22 10:08
処理系が落ちてこないので、試さずに挑む。
f n xs = [[xs !! (x + y) | y <- [..n-1]] | x <- [..(length xs)-n]]

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

70:デフォルトの名無しさん
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 (´∀`) 'マターリ)
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/22 19:20
> 「関数のn乗」
手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。

77:74
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
04/02/22 20:18
最後は>>76宛。

79:74
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/03/03 22:00
sage

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

84:デフォルトの名無しさん
04/03/23 22:23
Functional Programming With Haskell
URLリンク(www.amazon.com)

久々の新刊かも

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


86:デフォルトの名無しさん
04/03/23 22:49
前スレでガイシュツだったのか。
スレリンク(tech板) #554
一年以上も前に。

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

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

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

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

91:デフォルトの名無しさん
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:デフォルトの名無しさん
04/03/31 17:53
stripして3M弱だな。

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

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

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

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

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


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

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

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

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

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

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

101:デフォルトの名無しさん
04/04/08 15:40
マニュアル印刷したいんだけど、1枚のHTMLにしてくんないかな。印刷しづらい。
URLリンク(www.sampou.org)


102:デフォルトの名無しさん
04/04/08 15:53
>>101
そんなのちょこっとスクリプト走らせれば楽勝だろ?

103:デフォルトの名無しさん
04/04/08 19:12
>>98
> みんなまずインタプリタで開発して、
おれはそうしてる。GHCiでときどきHugsでチェック。

> インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い?
そんな経験は無い。

104:デフォルトの名無しさん
04/04/08 20:10
>>100
ありがとう

試してみてうまくいったらまた報告します

105:デフォルトの名無しさん
04/04/08 22:55
NHCの方が良質のコードを生成するって聞いたことあるけど、
もう今は昔の話なのかな?

106:デフォルトの名無しさん
04/04/08 23:14
このスレでも聞いてみる。
Scheme,OCaml,Haskell,Clean、覚えて「損しない」「一番得」
な言語はどれ。ぶっちゃけ周辺ライブラリーが充実してるのどれ。

107:デフォルトの名無しさん
04/04/08 23:20
>>106
得するのは、全部覚えること。
得しないのは、ひとつしか覚えないこと。

108:デフォルトの名無しさん
04/04/08 23:54
>>106
若いなら全部やれ

109:デフォルトの名無しさん
04/04/09 00:27
>>105
コンパイルは速いけどね。
Hugs/GHC共通のHierachical moduleの多くが使えないのが痛すぎる。

今試しに
main = interact id
をnhc98(FreeBSD-CURRENT, from ports)でコンパイルしたらbus error....

110:デフォルトの名無しさん
04/04/09 00:34
r抜けてたHierarchical

111:デフォルトの名無しさん
04/04/12 16:54
>>106
統計やるならRが結構ナイスだ。

112:デフォルトの名無しさん
04/04/12 22:37
>>110-111
Rスレはこっちに↓あ〜る

= 統計解析フリーソフト R =
スレリンク(math板)

113:デフォルトの名無しさん
04/04/14 12:02
工科大の
URLリンク(www.teu.ac.jp)
の問題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版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです)

114:デフォルトの名無しさん
04/04/14 13:37
>>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

115:デフォルトの名無しさん
04/04/14 14:00
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

116:デフォルトの名無しさん
04/04/14 14:37
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)

117:デフォルトの名無しさん
04/04/14 14:38
fix f = f (fix f)ね。

118:デフォルトの名無しさん
04/04/19 19:21
Haskell に例外処理の機構はあるの?

119:デフォルトの名無しさん
04/04/19 19:37
ある。
Haskell98でもIOモナドからthrowできる例外(IOError)があるし、
最近のGHC、Hugsでは普通の関数からも例外(Exception)をthrowできる。
catchはIOモナドの中でおこなう。

参照: Control.Exception

120:デフォルトの名無しさん
04/04/20 23:50
Haskell勉強中なんですけど、
「モナドは継続渡しを提供する」という大雑把な理解でいいでしょうか?
・・・違うかな?

121:デフォルトの名無しさん
04/04/24 22:23
なんで Prelude で (!!) は Integer じゃなくて Int で定義されているの?

122:デフォルトの名無しさん
04/04/25 02:07
>>121
実際問題それ以上使うことはないからだろう。
Haskell 98 Report によると maxBound::Int は少なくとも 2^29-1。
(!!)のインデックスは0-originだから、長さ2^29のリストまで扱える。
これ以上の長さのリストを使う場面は……。

123:デフォルトの名無しさん
04/04/25 12:41
円周率の世界記録に朝鮮したい人はどうすれば?

124:デフォルトの名無しさん
04/04/25 18:11
>>123
自分で最低義すれ。

125:デフォルトの名無しさん
04/04/26 14:54
>>123
円周率は全桁保持していなくても次を計算できたはず。

>>124
アドレスの制限があるから多くの計算機と既存の処理系では
再定義しても無駄。

126:デフォルトの名無しさん
04/04/26 23:48
>>120 こんなん見つけた

URLリンク(www.jaist.ac.jp)

ここの資料はjaistのゼミ資料?
他にはHaskellDBが自分的に興味深い.
TorqueとかHibernateなんて目じゃない. Haskellだけど…

127:デフォルトの名無しさん
04/04/27 14:27
>>121
haskell@でもちょうど議論されてるね。
上ででたものの他に、こういう意見があった。

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

Integerには反対派:
    Integerにするのは、巨大なリストという特殊な状況への最適化である。
    (Integral b) => がよろしい。

128:デフォルトの名無しさん
04/04/27 18:46
Hanatani さんすげーな。
オレもああいう凄腕Haskellerになりたい。

129:デフォルトの名無しさん
04/04/28 12:39
>>128
なんか凄いもの作ったの?

130:デフォルトの名無しさん
04/05/05 01:32
しばらく見ないうちに「関数型言語」のスレがひどいことになってるな。


131:デフォルトの名無しさん
04/05/05 02:34
>>130
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜

132:デフォルトの名無しさん
04/06/27 22:34
たま〜にはあげてみる

Haskell Support for the Eclipse IDE
URLリンク(eclipsefp.sourceforge.net)

0.3.0はEclipse最新var.(M9〜正式版)に対応しているぞ。

133:デフォルトの名無しさん
04/06/30 18:10
おお. しかしスクリーンショットがほしい所かも. 後でインスコしてみるか…

Fudgets
URLリンク(www.cs.chalmers.se)

触ってる人いる? これから弄ってみようと思うのだけど.

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.

とある. なんだか期待大.

134:デフォルトの名無しさん
04/06/30 20:48
>>133
使えたら是非おしえてくれ。
Declarative GUI toolkitって数年前から
どれもメンテが止まってるっぽいんだよな。

最近ではwxHaskellがスタンダードになりつつあるけど、
やっぱりHaskellならDeclarativeにやりたい。

135:デフォルトの名無しさん
04/07/17 08:42
Haskell Marathon
URLリンク(www.sampou.org)

136:デフォルトの名無しさん
04/07/18 09:25
Haskell で Marathon を実装するのかとオモタ。

137:デフォルトの名無しさん
04/07/26 01:14
マラソン参加してみようかな。入門ページ読んだくらいで準備はよいだろうか

138:デフォルトの名無しさん
04/07/29 09:20
マラソン直前に台風直撃の悪寒

139:デフォルトの名無しさん
04/08/09 23:33
LL WeekendでのHaskellに対する聴衆の感想は「Haskellのコードはよくわからない」というのが多かったみたいでつね

140:デフォルトの名無しさん
04/08/10 01:19
5分だか7分だかでわかれという方が無理があるという話がある。発表者陣はよ
くやったと思うよ。
「わたしはもうループも書けなくなってしまって……」というのにワロタ。

141:デフォルトの名無しさん
04/08/11 02:33
LL侍はHaskellを斬ったの?

142:デフォルトの名無しさん
04/08/12 01:39
>>141
「Hello, worldもブラックボックス斬り」されてました。

143:デフォルトの名無しさん
04/08/12 13:41
おれはhaskell haskell haskellだ
関数型の haskellだ
短くて 簡潔で 理解しやすいコードを書けるぜ
って、言うじゃない

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

残念!
「Hello worldさえブラックボックス」
斬り

144:デフォルトの名無しさん
04/08/12 20:55
むしろHello, worldだから難しいような気がする


145:デフォルトの名無しさん
04/08/12 21:58
main = do putStr "Hello, World!"

で済むから、コード自体は特に難しくは見えない。
ただ、入門者が Hello, World に到達するまでの過程が難しいんだよね……。


146:デフォルトの名無しさん
04/08/12 22:00
>>145
そのdoはいるの?

147:145
04/08/12 23:13
この場合はいらないけど、先々のことを考えたら入れた方がいいかな、とちょっ
とだけ思ったのです。
main = do str <- getLine
putStr str
みたいに。


148:デフォルトの名無しさん
04/08/13 07:57
いきなりIOから入るのがまずい。
fact→fib→qsortあたりから入れば
得体の知れないモナドをとりあえず回避できる。

149:デフォルトの名無しさん
04/08/13 16:25
再帰とリスト処理しかできないHaskellちゃん
がんばってもせいぜい二分木

150:デフォルトの名無しさん
04/08/13 17:34
膣門です。
"Hindley-Milner" って、何て読むんでつか?


151:デフォルトの名無しさん
04/08/14 01:49
誰か「モナドだけで書く Haskell プログラミング」を書いてくれい

152:デフォルトの名無しさん
04/08/15 13:29
>>151 Cでも使ってれば?

153:デフォルトの名無しさん
04/08/15 21:34
そういやHaskellのコンパイルはC経由なんだよね

154:デフォルトの名無しさん
04/08/15 22:04
末尾再帰の保証とかC経由じゃ無理だろ

155:デフォルトの名無しさん
04/08/15 22:21
GHCで最適化オプション付けるとCのコード吐くんじゃなかったっけ?

156:デフォルトの名無しさん
04/08/16 02:59
>>150
メール出して聞いたら?
URLリンク(www-maths.swan.ac.uk) J. Roger Hindley
URLリンク(www.cl.cam.ac.uk) Robin Milner

157:デフォルトの名無しさん
04/08/16 05:57
>>156
もちつけ

158:デフォルトの名無しさん
04/08/16 06:12
>>154
そりゃ当然、Cにする前にプログラム変換するだろ
それに大抵のCCには-foptimize-sibling-callsみたいなのがあるだろうし

159:デフォルトの名無しさん
04/08/16 08:24
レベル低いな。っつってもHaskellのことは何も知らないのであれなんだが。。。
ユーザーレベルで言語をマスターするっつーのは、ある処理系を骨までしゃぶり
尽くすことだろ。リスパーのように自作こそ最強だが、複雑な言語ではそこまでは
まあ、なかなか出来るもんでもないしな。
GHCのことについて詳しい奴がいないのを見ると、誰もHaskellでまともに
プログラム書こうとしてないように見える。結局おまいらは、話のネタに
関数型言語を選んでるだけなんだよ。

160:デフォルトの名無しさん
04/08/16 23:20
↑Aransk?

161:デフォルトの名無しさん
04/08/17 00:31
Simon Peyton Jones は C-- もやってるのに、自前でオプティマイズ出来ないってのは意外。

162:デフォルトの名無しさん
04/08/17 00:50
>160
Aranskはいちゃもん言うだけでプログラムすら書かんだろ?

163:デフォルトの名無しさん
04/08/18 12:47
wxhaskellについてですが、
サンプルプログラムのBouncingBalls.hsでセグメンテーションフォールトが
起きます。(URLリンク(wxhaskell.sourceforge.net))
プログラムを起動し、'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

他の環境でもこのバグが再現するでしょうか。

164:デフォルトの名無しさん
04/08/19 17:20
>>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"

とりあえずバージョンアップしてみれば

165:デフォルトの名無しさん
04/08/22 09:05
wxHaskellを0.8にバージョンアップしたら問題は解決しました。
どうもありがとうございます。

166:デフォルトの名無しさん
04/08/22 09:36
このような関数はどう書けばいいんでしょうか?

f (+) [1 2 3] [4 5 6] => [5 7 9]

167:デフォルトの名無しさん
04/08/22 11:30
f g (x:xs) (y:ys) = (g x y) : f g xs ys

168:デフォルトの名無しさん
04/08/22 11:41
f g xs ys = [g x y | (x, y) <- zip xs ys]

169:デフォルトの名無しさん
04/08/22 11:55
これを拡張したn引数(n階?)の関数とn個のリストをとる
関数はどう書くのがいいでしょう。

f n g [x11, x12, ...] [x21, x22, ...] ... [xn1, xn2, ...]
=> [(g x11 x21 ... xn1), (g x12 x22 ... xn2), ...]

みたいな。lispのmapってこんな感じですよね。あちらは
関数のarityがわかるからnは不要ですけど。


170:デフォルトの名無しさん
04/08/22 12:19
f g = map (hoge g) $ zip
Haskellはよく知らんので、hogeをどうやって書くのか調べてもよく分からん。

171:デフォルトの名無しさん
04/08/22 16:24
引数の数が可変ってhaskellでは書けないような気が。
何か方法あったっけ?

172:デフォルトの名無しさん
04/08/22 16:45
>>166

zipWith (+) [1, 2, 3] [4, 5, 6]

173:デフォルトの名無しさん
04/08/22 17:19
>>171
別に可変個の引数は必要ない。
1引数の関数のリストと引数のリストを受け取って適用して返す演算子をつくればOK。
演算子をxとすると
[f, f, f] x [x11, x12, x13] x [x21, x22, x23]
とか。Haskellの細かい文法知らんのでこう書けるかどうかは知らないけど。



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

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