トップページ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
0322デフォルトの名無しさんNGNG
http://www.teu.ac.jp/kougi/koshida/Prog6/text02.html
ここで使っている、
文字→コード ord :: Char -> Int
コード→文字 chr :: Int -> Char
という関数が定義されていないようです。
環境はwindows 2000 でhugsを使っています。
:versionと入力すると、以下のように出ます。
-- Hugs Version Nov 2003
:browse Preludeとしてみてもordという関数はないので
バージョンUPして使えなくなったということでしょうか?
0323デフォルトの名無しさんNGNG
Prelude> :l Char
Char> :t ord
ord :: Char -> Int
0324デフォルトの名無しさんNGNG
>>319
わざわざ Float->Int->FloatにしようとするからfromIntegralが
必要になる。

f x n = sin ( pi * x * (2 * n + 1))

だけで明示的に型を指定するのやめれば

*Main> :t f
forall a. (Floating a) => a -> a -> a

という型になるがあとは勝手にやってくれるよ。
0325デフォルトの名無しさんNGNG
あーでもそれじゃnに整数以外の数つっこめちゃうのでだめか。

0326320NGNG
>>321
ありがとうございます。gnuplotでグラフを書かせるためのファイルを
出力しようと目論んでいるのですが、rubyより知的な気分ですね。

可読性はどうなんでしょう。
多少字面は見づらいけど、数学みたいに書けて
コンピュータ特有のことを考えないで済む分楽かもしれませんね。
0327デフォルトの名無しさんNGNG
>>323
なるほど。:loadしないと使えないのですね。
runhugsやGHCで使う場合というか、ファイルに書いておいて使う場合は、
(なんていったらよいのでしょう?)
import Charすればよいのですね。わかりました。

ありがとうございます。
0328デフォルトの名無しさんNGNG
みんなこの言語使って何やってるの?
0329デフォルトの名無しさんNGNG
「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。
関数型って言うんだけどね。」
「すごーいよく分からないけどかっこいいー」
0330デフォルトの名無しさんNGNG
「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。
関数型って言うんだけどね。」
「すごーいよく分からないけどかっこいいー。じゃあ、今晩はカレーにしようか?」
0331デフォルトの名無しさんNGNG
今晩はカリーか。
0332デフォルトの名無しさんNGNG
今晩はカリだ。
0333デフォルトの名無しさんNGNG
アライグマ Haskell
0334デフォルトの名無しさんNGNG
>>328
言語習いたてのワクワクをモ一度味わいたくて。
とりあえずKISSローダ作るのが目標です。
0335デフォルトの名無しさんNGNG
KISSローダってなんですか
0336デフォルトの名無しさんNGNG
CommonLisp/Scheme と Haskel と ML の中で一番実用に近いのは何?
私は CommonLisp だと思うんだけど。
0337デフォルトの名無しさんNGNG
>>336
比較対象が微妙に違っているわけだが。
0338デフォルトの名無しさんNGNG
0339デフォルトの名無しさんNGNG
すみません。最近勉強を始めた者ですが、頭が悪いものでどうにもわからず
困っています。よろしければご教授願えませんでしょうか。
3つをまとめる関数 zip3 を zip を用いて定義せよ、という問題で
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs
where
change :: [((a,b),c)] -> [(a,b,c)]
change [((x,y),z)] = [(x,y,z)]
zip3 _ _ _ = []
というものを考えたものの、どこがどう悪いのか自分ではわかりません。
1週間悩んで進展なしで独力では無理なようなので、どなたかお教えいただけませんでしょうか?
0340デフォルトの名無しさんNGNG
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 xs ys zs = map change $ zip xs (zip ys zs)
where
change (x,(y,z)) = (x,y,z)
0341デフォルトの名無しさんNGNG
>>339
型があってない。っていうかzip使ってない。

> zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs
x , y, z :: aだから zip x y とはできない。(もともとa = [b]でないかぎり)
zip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs
と書こうとしてるわけだからこれではzipの使いようがない。

参考>>184の上半分
zip3 x y z = (,,) <$> x <-> y <-> z
0342デフォルトの名無しさんNGNG
{-
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = (f x y) : (zipWith f xs ys)
zipWith f [] _ = []
zipWith f _ [] = []

zip :: [a] -> [b] -> [(a,b)]
zip xs ys = zipWith mkpair xs ys
  where
    mkpair x y = (x, y)
-}
zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3 xs ys zs = zipWith mkpair xs (zip ys zs)
  where
    mkpair x (y, z) = (x, y, z)
0343デフォルトの名無しさんNGNG
zip3' = (zipWith (uncurry (,,)) .) . zip
0344デフォルトの名無しさんNGNG
zip3' = const zip3 zip
0345デフォルトの名無しさんNGNG
339です。自室のPCからでははじかれてしまって書き込みができなかったので
遅くなってしまいましたが、ありがとうございます。
たいへん助かりました。
…お礼の言葉が遅くなってしまい、申し訳ありませんでした。m(__)m
0346デフォルトの名無しさんNGNG
-- Haskell Mode

Haskell Haskellモード 関数型言語でーす

Haskellモード Haskellモード Haskellモード Haskellモードでーす
Haskellモード うにゃ〜 うにゃにゃ lazily evalute!

関数 … カリー様 関数 … か・た・す・い・ろん
モナド >>= … わたしのシモベェ〜 モナド >>= …

Haskellモード Haskellモード Haskellモード 98モードでーす
Haskellモード Haskellモード Haskellモード Haskellモードでーす

たらい、回したくなっちゃった…
0347デフォルトの名無しさんNGNG
>>346
大丈夫?
0348デフォルトの名無しさんNGNG
Everyday Haskell
http://www.sampou.org/cgi-bin/haskell.cgi?Everyday&l=jp
が面白い
0349デフォルトの名無しさんNGNG
fold右派とfold左派にワラタ
0350デフォルトの名無しさんNGNG
The Evolution of a Haskell Programmerでググれ
という話ではなかったようだなスマソ
0351デフォルトの名無しさんNGNG
これ既出?
http://www.cin.ufpe.br/~haskell/vhs/
0352デフォルトの名無しさんNGNG
>>347
346の文字列を読んで、ラテン系の伴奏が聞こえてくるようだと
かなりダメ。
0353デフォルトの名無しさんNGNG
>>346
禿げワロス
カリー様(・∀・)イイ!!
0354デフォルトの名無しさんNGNG
保全sage
0355デフォルトの名無しさんNGNG
Hatena::Diary 「Haskell」を含む日記
のとある日記を見てちょっとワラた

「むしゃくしゃしてやった.Haskell で書くつもりはなかった.今は反省している.簡潔に書けるが,知らない人には全く読めないだろうし,知っている人はもっとうまく書くかもしれない.」
0356デフォルトの名無しさんNGNG
ocaml age
0357Aransk05/01/18 12:16:33
>>355
ワラた。
++ "しばらくしたら…誰も読めなくなるだろう。"
0358デフォルトの名無しさん05/01/23 14:46:59
The Implementation of Functional Programming Languages オンライン復刻記念
ttp://research.microsoft.com/Users/simonpj/papers/slpj-book-1987/

って既出?
0359デフォルトの名無しさん05/01/24 10:44:32
>>358 おおっ! 既出ではないと思う。さんくす。
といいつつ書籍で持ってるのだがw。いい本だよねー。

0360デフォルトの名無しさん05/01/24 10:56:09
OCamlだとMLっぽいから書きやすいんだけど…。
0361デフォルトの名無しさん05/01/24 18:01:20
>>358
やけにでっかいから何かと思ったら、300もあるページがみんな画像……
0362デフォルトの名無しさん05/01/25 02:46:41
Revision Control System を、調べてたら、
darcs ( ttp://abridgegame.org/darcs )
というのを、ハケーンしました。
これは、haskell で書かれているので、「haskellってなんや。」と調べる流れでここに来ました。

私が知らないだけ、haskellでかかれたアプリはいっぱいあるのかも知れませんが、
上の方に出てないみたいなので、書いてミマス。

激しくガイシュツでしたらすいません。
0363デフォルトの名無しさん05/01/25 15:14:39
haskellで書かれたアプリはそんなに珍しくないと思う。
http://www.haskell.org/practice.html
にいくつか載ってる。
0364デフォルトの名無しさん05/01/25 15:17:08
haskellとOCamlではどちらがメジャーですか?
0365デフォルトの名無しさん05/01/25 15:25:18
そういうのをドングリの背比べというのではないだろーか。
0366デフォルトの名無しさん05/01/25 16:01:51
スラド本家?とLtUで取り上げられた<darcs
http://it.slashdot.org/article.pl?sid=04/11/25/0136249&tid=156&tid=218
http://lambda-the-ultimate.org/node/view/391

純粋に関数的な「パッチの適用」を,ファイルやディレクトリの読み書きからキレイに分離でき,
また,パターンマッチングと高階関数が,パッチのプリミティブの実装にとてもマッチする,とある.

詳しくはこちら.
http://osdir.com/Article2571.phtml
0367デフォルトの名無しさん05/02/06 15:35:00
>>346
超ワロタw
0368デフォルトの名無しさん05/02/06 19:52:48
>>367
元ネタキボンヌ
036934605/02/06 20:18:15
>>368
http://that3.2ch.net/test/read.cgi/gline/1104975149/1-9
0370デフォルトの名無しさん05/02/07 04:10:20
ぬるほど
0371デフォルトの名無しさん05/02/09 05:46:41
Haskellの初歩を学校でやっているのですが、
宿題が出て難しすぎるので誰か助けて下さい。
0372デフォルトの名無しさん05/02/09 10:53:26
2つの項を入力されたらmost general unifierを出力する
*(1,y) *(x,+(a,b)) -> {x->1,y->+(a,b)}
のようなプログラムを作れ、という課題が出たのですがサッパリわかりません。
どなたか教えて下さい
0373デフォルトの名無しさん05/02/09 20:23:43
>>372
もう一年やれば、理解も深まるよ。
0374デフォルトの名無しさん05/02/09 20:27:03
というか,課題が全然理解できないんだが.
0375デフォルトの名無しさん05/02/09 20:42:11
あ,分かってしまった.もう一年がんばってね.
0376デフォルトの名無しさん05/02/09 20:59:08
問題の意味がわからないのならどうしようもないな
0377デフォルトの名無しさん05/02/09 22:14:31
>>372
これ、数学板のmathematicaスレでも見たぞ
マルチすんな、消えろ
0378デフォルトの名無しさん05/02/09 23:27:11
もっと低レベルな人にあわせてくれる学校に入りなおしましょう。
0379デフォルトの名無しさん05/02/09 23:49:57
>>370
カッ
0380デフォルトの名無しさん05/02/10 01:16:45
[1,5,8,43]などのリストをパラメータとして受け取って
[("1st",43),("2nd",8),("3rd",5),("4th",1)]のように
ランクをつけてランク順に返す関数が欲しいのですが
問題は[5,6,6,22,23,24,24]のような場合に
[("1st",24),("1st",24),("3rd",23),("4th",22),("5th",6),("5th",6),("7th",5)]
のように返さなければいけないことです。どうすればいいかさっぱりです。
誰か教えて下さい。
0381デフォルトの名無しさん05/02/10 02:07:40
List> group $ reverse $ sort [5, 6, 6, 23, 24, 24]
[[24, 24], [23], [6, 6], [5]]
ここまで来りゃ後はなんとでもなるだろ。
0382デフォルトの名無しさん05/02/10 02:35:51
>>381
ありがとうございます!!
0383デフォルトの名無しさん05/02/10 02:43:00
あ、ランクを付ける際にはカウンタみたいなものを用意するんですか?
0384デフォルトの名無しさん05/02/10 04:08:38
宿題か? 宿題なのか? テメエェェェ
0385デフォルトの名無しさん05/02/10 07:31:12
>>381
演算子 $ って初めて見ましたが,なかなか便利ですね.
勉強になりました.
0386デフォルトの名無しさん05/02/10 09:38:36
はい、そーです
0387デフォルトの名無しさん05/02/10 23:12:49
> ここまで来りゃ後はなんとでもなるだろ。

いろいろ考えたのですがなんともなりません。
むしろここから先が一番大変なのではないかと・・・
まじで教えてくれませんか?
0388デフォルトの名無しさん05/02/10 23:27:15
ここまで来てなんともならんてのは、けっきょく全然理解してないってことだ
ろ。これくらい自分で考えてみ。でないとただのカンニングだろ。
0389デフォルトの名無しさん05/02/11 03:20:58
僕にはこれが限界でした。

rank :: [[a]] -> [(Int, a)]
rank x = [(i, n) | (i, a) <- zip [1..] x, n <- a]

確かに理解は非常に足りません。ですが、本を読んでも、
いろいろなほかのテクニックを知ってもループという基本的なことを
するのがこんなに難しい言語は初めてなのです。
なんらかのライブラリを使う必要があるのかもしれないと思って、
Listのところは大体見たんですが結局何も見当たらずもうダメです。
こんな簡単であろう問題に3時間も4時間もかけてる自分がすごい嫌になってきます。
0390デフォルトの名無しさん05/02/11 04:03:59
ま、気楽にやれや、学生なんだし。
0391デフォルトの名無しさん05/02/11 04:52:51
そう気楽でもないんすよ。いろいろあって。
ヒントを下さい。お願いします。
0392デフォルトの名無しさん05/02/11 08:05:13
>>391
[1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。
英語のカウントに勝手に直してくれるようなライブラリはないだろうな。
0393デフォルトの名無しさん05/02/11 09:27:09
>>392
> [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。

そのリストはどこまで続くんですか?
0394デフォルトの名無しさん05/02/11 09:48:51
いや、それじゃランク順の法則が違うんですよ。それだと
[("1st",24),("1st",24),("2nd",23),("3rd",6),("3rd",6),("4th",5)]
になっちゃうんですよ。

課題は
[("1st",24),("1st",24),("3rd",23),("4th",6),("4th",6),("6th",5)]
にならなきゃいけないので前のリストのカウントを常にしないと次のランクが
分からないわけです。これをどうしたものかと・・・・

>>393
同じ課題で悩んでる人ですか?そのリストは(length x -1)thまで続くんじゃないでしょうか?

与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。

addSuffix :: Int -> String
addSuffix x
| x == 1 = "1st"
| x == 2 = "2nd"
| x == 3 = "3rd"
| otherwise = show x ++ "th"
0395デフォルトの名無しさん05/02/11 10:08:15
>>394
> にならなきゃいけないので前のリストのカウントを常にしないと次のランクが
> 分からないわけです。これをどうしたものかと・・・・

rankingの関数が、
1)降順ソートずみ整数の(部分)リスト (初期値 全リスト)、
2)これまでに処理した整数の数 (初期値 ゼロ)、
3)直前に処理した整数 (初期値 -1とか、入力リストに絶対あらわれないもの)、
4)直前に処理した整数のランク (初期値 ゼロ)、
のよっつを引数として取ればいいんじゃないの?

> 与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。
> | otherwise = show x ++ "th"
これだと
21番目は "21th"
22番目は "22th"
になっちゃうよ……
0396デフォルトの名無しさん05/02/11 10:51:06
あ、ほんとだ!ご指摘ありがとうございます。
じゃぁ条件分岐のところ、xの代わりにmod x 10で。

rankingの関数はやはり4つも引数が必要ですか・・・・。
じゃぁそれでちょっと頑張ってみます。
0397デフォルトの名無しさん05/02/11 11:01:33
ちょっとやり方は違うけど4つの引数使ってやっとできました。
でもなんかぎこちない感じ・・・。これでいいのでしょうか。
もっとスマートなやり方があるような気がしてなりません。

setRank :: [Int] -> [(String, Int)]
setRank [] = []
setRank (x:xs) = ("1st", x):[(addSuffix a, b) | (a, b) <- subSetRank xs x 2 0]

subSetRank :: [Int] -> Int -> Int -> Int -> [(Int, Int)]
subSetRank [] _ _ _ = []
subSetRank (x:xs) preVal position k
| x == preVal = [((position - (k+1)), x)] ++ (subSetRank xs x (position+1) (k+1))
| otherwise = [(position, x)] ++ (subSetRank xs x (position+1) 0)

addSuffix :: Int -> String
addSuffix x
| mod x 10 == 1 = "1st"
| mod x 10 == 2 = "2nd"
| mod x 10 == 3 = "3rd"
| otherwise = show x ++ "th"
039839205/02/11 11:01:34
>>394
失礼。俺なら395よりは、
groupBy (\x y -> snd x == snd y) $ zip [1..] $ reverse $ sort [5, 6, 6, 23, 24, 24
]
から変形するな。
0399どうでしょうか,,,05/02/11 11:11:26
import List
rank :: Integer -> String
rank x
| x `mod` 10 == 1 = s ++ "st"
| x `mod` 10 == 2 = s ++ "nd"
| x `mod` 10 == 3 = s ++ "rd"
| otherwise = s ++ "th"
where s = show x

ranks :: [String]
ranks = map rank [1..]

sort_group :: Ord a => [a] -> [[a]]
sort_group l = group $ reverse $ sort l

main :: Ord a => [a] -> [(String,[a])]
main lst = zip ranks (sort_group lst)
0400デフォルトの名無しさん05/02/11 11:14:24
>>399
全然違うじゃないか。
それにmainはIO aの型であるべきもので、使わないほうがいい。
0401デフォルトの名無しさん05/02/11 11:21:27
誰も書かないから突っ込むけど、
11th,12th,13th

そんな私はsort使うためにimport Listするとhugsにレイアウトが違うと怒られる駄目駄目プログラマ。
040240105/02/11 11:27:11
importがImportになってた スレ違い御免orz
0403デフォルトの名無しさん05/02/11 11:28:33
どうもありがとうございます。おかげ様で前のよりはマシになったかと思います。

setRankS :: [Int] -> [(String, Int)]
setRankS x = concat [setFirst n | n <- (groupBy (\x y -> snd x == snd y) $ zip [1..] x)]

setFirst :: [(Int, Int)] -> [(String, Int)]
setFirst ((x, y):xs) = [(addSuffix x, b) | (a, b) <- ((x, y):xs)]
0404デフォルトの名無しさん05/02/11 11:41:07
>>401
またまた貴重なご指摘ありがとうございます。

addSuffix :: Int -> String
addSuffix x
| x == 11 = s ++ "th"
| x == 12 = s ++ "th"
| x == 13 = s ++ "th"
| mod x 10 == 1 = s ++ "st"
| mod x 10 == 2 = s ++ "nd"
| mod x 10 == 3 = s ++ "rd"
| otherwise = s ++ "th"
where s = show x
040540105/02/11 11:52:24
あーごめんなさい。私もまだ間違ってた。
111th,112th,113th,211th....。序数詞は怖い。もうないよね。
0406デフォルトの名無しさん05/02/11 12:03:11
| mod x 100 == 11 = s ++ "th"
| mod x 100 == 12 = s ++ "th"
| mod x 100 == 13 = s ++ "th"

これ足せばOK?
0407デフォルトの名無しさん05/02/13 13:11:54
宿題しか話題のない悲しい言語
0408デフォルトの名無しさん05/02/13 15:11:50
>>407
> 宿題しか話題のない悲しい言語
達見かな。で、どうしてそうなのかという質問がなされ、欠点が羅列され、
いやそんなことはない理論的に美しいという反論が出て、数少ない実用例も示され……
0409デフォルトの名無しさん05/02/13 16:36:48
関数型言語なんてみんなそうなんじゃない?
Lisp系は処理系が簡単だから使われるけど、それ以外は…
0410デフォルトの名無しさん05/02/13 17:23:54
初心者を馬鹿にするとき、一番盛り上がります。
0411デフォルトの名無しさん05/02/13 17:32:09
>>409
OCamlをフリーソフト(非オープンソース)を書くのに使っていますが。
0412デフォルトの名無しさん05/02/13 18:02:27
じゃあ、みんなでHaskellで言語処理系を作ろう。
0413デフォルトの名無しさん05/02/13 18:21:28
Haskellでテトリスは作れますか?
0414デフォルトの名無しさん05/02/13 18:26:54
>>413
作れます。
0415デフォルトの名無しさん05/02/13 18:33:34
Haskellのテトリス↓
http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/Hetris/
http://fxp.hp.infoseek.co.jp/haskell/HSDL/
0416デフォルトの名無しさん05/02/13 18:55:01
ghcってどれくらいきちんとdebugされてるのかなあ。
仕事に使っても大丈夫?
0417デフォルトの名無しさん05/02/13 22:14:38
>>411
こういうコンテキストで話すなら、商用に使われてナンボだと思うが。
俺自身は宿題用だろうが日曜プログラマーの趣味の道具だろうが構わんけど。
0418デフォルトの名無しさん05/02/14 15:53:01
>>416
まあオープンソースだから、sourceforge.net/projects/ghc/やメーリングリストを見て
自分で判断してくださいということで。


ver6.4のリリースが延び延びになっているのが気になる。
RCのソースもコンパイルできないし…(@Mac)
0419デフォルトの名無しさん05/02/14 20:24:12
そうそう。
あくまでも最先端の研究用なので、品質に期待してはいけない。
0420デフォルトの名無しさん05/02/19 08:34:16
C,C++の代わりとまではいかなくても、
Perlの代わりぐらいにはなりますか?
0421デフォルトの名無しさん05/02/19 11:17:33
>>420
もう少しHaskellのこと勉強してから出直してきたら
■ このスレッドは過去ログ倉庫に格納されています