関数型プログラミング言語Haskell Part22
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/03/23(土) 12:34:19.09ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
0412デフォルトの名無しさん
2013/05/13(月) 21:40:22.590413デフォルトの名無しさん
2013/05/14(火) 00:03:59.85述語論理で使う∀も同じ意味だと思うが
0414デフォルトの名無しさん
2013/05/14(火) 01:03:52.840415デフォルトの名無しさん
2013/05/14(火) 06:53:54.53ID:XUYxe5VW!ありがと。
0416デフォルトの名無しさん
2013/05/14(火) 07:50:37.25全然違う
0417デフォルトの名無しさん
2013/05/14(火) 22:17:48.75ID:XUYxe5VW!data Hoge = True | False
f :: Int -> Hoge
f x = if (x=2) then True else False
みたいにHogeタイプを確定してくれるものだと思ってた。
0418デフォルトの名無しさん
2013/05/15(水) 00:31:15.320419デフォルトの名無しさん
2013/05/15(水) 00:51:38.29412,416の意見に惑わされるな
他人の意見に惑わされるな
お前がどうするかだ! お前がどう動くかだ!
お前がどうするかだ! お前がどう動くかだ!!
決めるのは誰だ? やるのは誰だ? 行くのは誰だ?
そう お前だ! お前が舵を取れ!
お前が行け! お前が走れ! お前が行くから道になる
前へ 前へ 前へ 前へ ただただひたすら前へ突き進めばいい
わかるか! わかるか! お前が決めろ お前がしっかり舵を取れ
0420デフォルトの名無しさん
2013/05/15(水) 09:48:34.340421デフォルトの名無しさん
2013/05/15(水) 11:06:47.110422デフォルトの名無しさん
2013/05/15(水) 13:17:18.57関数型は理系・知的
という書き込みをみたらバカはなんて思うか
知的に憧れ関数型をやるに1万円
0423デフォルトの名無しさん
2013/05/15(水) 13:34:44.35・本物のプログラマはHaskellを使う
自信が無いプログラマや社会事情を知らない独学者の心のスキをついたキャッチフレーズ
・手続き型言語はオワコン、関数型言語の時代
IT特有の最先端の物を取り入れるという美徳心理をついたこと
・手続き型言語=一般人 関数型言語=変態
人と違うように思われたいという選民意識を釣ったこと
0424デフォルトの名無しさん
2013/05/15(水) 14:13:01.260425デフォルトの名無しさん
2013/05/15(水) 16:47:21.37お前が消えて喜ぶ奴にお前のオールを任せるな
0426デフォルトの名無しさん
2013/05/15(水) 19:57:55.330427デフォルトの名無しさん
2013/05/15(水) 22:24:12.220428デフォルトの名無しさん
2013/05/15(水) 22:44:11.572枚目を参考にしながら
よろしくお願いします
http://i.imgur.com/pqa6Bk4.jpg
http://i.imgur.com/R8FsYBJ.jpg
0429デフォルトの名無しさん
2013/05/15(水) 22:45:03.160430デフォルトの名無しさん
2013/05/16(木) 00:07:18.35パターンマッチは値コンストラクタをマッチさせる。その例だと
f 2 = True
f x = False
みたいに書くのがパターンマッチ
f x | x == 2 = True
| otherwise = False
みたいに引数の性質によって場合分けするのがガード
型を確定どうのは型推論の話だと初学者がマジレスしてみるテスト
0431デフォルトの名無しさん
2013/05/16(木) 03:31:22.700432デフォルトの名無しさん
2013/05/16(木) 04:31:47.770433デフォルトの名無しさん
2013/05/16(木) 07:36:44.340434デフォルトの名無しさん
2013/05/16(木) 07:57:15.87「あって」とは?
0435デフォルトの名無しさん
2013/05/16(木) 08:06:05.350436デフォルトの名無しさん
2013/05/16(木) 11:53:47.98fって値コンストラクターなん?
0437デフォルトの名無しさん
2013/05/16(木) 17:45:58.750438デフォルトの名無しさん
2013/05/16(木) 17:51:46.01comb :: Maybe a -> (a -> Maybe b) -> Maybe b
comb Nothing _ = Nothing
comb (Just x) f = f x
safeSqrt x
| x >= 0 = Just (sqrt x)
| otherwise = Nothing
こんな使い分け。
0439デフォルトの名無しさん
2013/05/16(木) 18:24:32.33Prologと関数型言語は持ちつ持たれつ進んでいくのが一番いいよ。
0440デフォルトの名無しさん
2013/05/16(木) 19:12:04.820441デフォルトの名無しさん
2013/05/17(金) 13:00:50.42マチクタビレタ〜
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < Haskell Platform 2013.2.0.0 まだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
0442デフォルトの名無しさん
2013/05/19(日) 23:44:52.160443デフォルトの名無しさん
2013/05/20(月) 00:08:19.530444デフォルトの名無しさん
2013/05/20(月) 07:00:45.93Emacs + haskell-mode
0445デフォルトの名無しさん
2013/05/20(月) 07:09:44.51vim + hdevtools
0446デフォルトの名無しさん
2013/05/20(月) 15:32:57.020447デフォルトの名無しさん
2013/05/20(月) 20:17:09.78http://hackage.haskell.org/package/hdevtools
0448デフォルトの名無しさん
2013/05/20(月) 23:00:40.75sublime textがいいかもな
0449デフォルトの名無しさん
2013/05/21(火) 06:55:43.87初耳だな
0450デフォルトの名無しさん
2013/05/21(火) 08:41:53.58何でもかんでもvim使えとかemacs使えという人ならいっぱいいるけどww
0451デフォルトの名無しさん
2013/05/21(火) 09:22:10.27hoogleとかghs-modには大分前から対応してる
0452デフォルトの名無しさん
2013/05/21(火) 09:56:09.260453デフォルトの名無しさん
2013/05/21(火) 12:39:49.89Emacs 自体が使いやすいから、haskell-mode の開発が止まっても、仕方なく使い続けてる。
Haskell で C# や Java みたいに GUI パーツをペタペタ貼ったり、
ロジックをグラフィカルに定義できる様になれば、専用の開発環境に移るかもしれん。
さすがに、そういうのが Emacs で気持よくできるようになるとは思えないからね。
0454デフォルトの名無しさん
2013/05/21(火) 14:03:05.090455デフォルトの名無しさん
2013/05/21(火) 15:11:15.550456デフォルトの名無しさん
2013/05/21(火) 19:27:05.11http://hackage.haskell.org/package/yi-0.6.5.0
最終アップデートが2012年3月
それまでだいたい半年に1回くらいのペースで定期的にアップデートしてきたのに・・・
0457デフォルトの名無しさん
2013/05/21(火) 19:32:41.53俺は Linux だからいいけと、Windows で簡単にインストールできるようにならんと、流行らんな
0458デフォルトの名無しさん
2013/05/30(木) 18:55:48.240459デフォルトの名無しさん
2013/05/30(木) 20:38:48.49ID:WFTkAEQe!0460デフォルトの名無しさん
2013/05/30(木) 21:18:33.96どぞ
0461デフォルトの名無しさん
2013/05/30(木) 21:36:00.73ID:WFTkAEQe!haskell99の1~10をやっているのだが、9の問題で詰まった。
duplicateSet :: (Eq a) => [a] -> [a]
duplicateSet list = case (list) of
[] -> []
(x:y:xs)
| x == y -> y : duplicateSet (x:xs)
| otherwise -> [x]
deleteSet :: (Eq a) => [a] -> [a] -> [a]
deleteSet originaList set = case (originaList) of
(x:xs) -> case (set) of
(y:ys)
| x == y -> deleteSet xs ys
| otherwise -> error"Something wrong"
[] -> (x:xs)
_ -> error"Need at least one element"
pack :: (Eq a) => [a] -> [[a]]
pack list = case (list) of
[] -> [[]]
(x:xs) -> (duplicateSet list) : pack (deleteSet list (duplicateSet list))
0462デフォルトの名無しさん
2013/05/30(木) 22:02:32.130463デフォルトの名無しさん
2013/05/30(木) 22:20:15.44ID:WFTkAEQe!*Main> pack [1,1,1,2,2,3,4,4]
[[1,1,1],[2,2],[3],[4,4],[]]
があったとき、どうすれば最後の[]を消せるのだろうか?
元をちょこっと書き足してみたのだが。
duplicateSet :: (Eq a) => [a] -> [a]
duplicateSet list = case (list) of
[] -> []
[x] -> [x]
(x:y:xs)
| x == y -> y : duplicateSet (x:xs)
| otherwise -> [x]
deleteSet :: (Eq a) => [a] -> [a] -> [a]
deleteSet originaList set = case (originaList) of
[] -> []
(x:xs) -> case (set) of
(y:ys)
| x == y -> deleteSet xs ys
| otherwise -> error"Something wrong"
[] -> (x:xs)
-- _ -> error"Need at least one element"
0464デフォルトの名無しさん
2013/05/30(木) 22:46:41.040465デフォルトの名無しさん
2013/05/30(木) 23:11:33.94[] -> [[]] を[] -> []
とするんだよ。
0466デフォルトの名無しさん
2013/05/30(木) 23:25:30.45ID:WFTkAEQe![a] : [[]] -> [[a], ... []]にならないのだろうか?
[a]:[]はエラーな気がするのだが。
0467デフォルトの名無しさん
2013/05/30(木) 23:28:24.79なぜ、[a]:[]がエラーだと思うの?
0468デフォルトの名無しさん
2013/05/31(金) 00:12:00.47ID:8/3B9ldc!例えば、[1]:[2] -> error. しかし、1:[2] -> ok 見たいな?
間違ってました。
[1]:[]は[[1]]になるんだね。(1:[]) -> [1]の延長見たいなものか。
ありがとうございます。
0469デフォルトの名無しさん
2013/05/31(金) 07:30:24.940470デフォルトの名無しさん
2013/05/31(金) 19:54:30.74ID:8/3B9ldc!"abvcad*** Exception: Documents/Haskell/excercise.hs:(15,56)-(19,59): Non-exhaustive patterns in case
何がたりなんだろうか。
compress :: (Eq a) => [a] -> [a]
compress list = case (list) of
[] -> []
(_:_) -> (findDuplicate list) : (compress (deleteDuplicate list (findDuplicate list)))
where
findDuplicate :: (Eq a) => [a] -> a
findDuplicate list = case (list) of
[] -> error""
[x]->x
(x:y:xs)
| x==y-> findDuplicate (y:xs)
| otherwise -> x
deleteDuplicate :: (Eq a) => [a] -> a -> [a]
deleteDuplicate list element = case (list) of
[] -> []
(x:y:xs)
| x == element -> deleteDuplicate (y:xs) element
| otherwise -> list
0471デフォルトの名無しさん
2013/05/31(金) 20:55:58.86エラーメッセージ読めよ。
0472デフォルトの名無しさん
2013/05/31(金) 23:36:01.66compress (x:xs) = reverse $ foldl (\a y -> if head a == y then a else (y:a)) [x] xs
どうもすっきりしない…
[]を特別扱いしない方法はないでしょうか?
0473デフォルトの名無しさん
2013/05/31(金) 23:58:00.94head a と y が等しい場合を特別扱いしてるくせに・・・
0474デフォルトの名無しさん
2013/06/01(土) 00:50:55.280475デフォルトの名無しさん
2013/06/01(土) 11:24:15.57ID:05NwpYWl!終了させるにはどうすれば良いかな。
試しに[x]->[x]入れたら無限に津尽くし。
0476デフォルトの名無しさん
2013/06/01(土) 12:10:42.800477デフォルトの名無しさん
2013/06/01(土) 12:51:27.14compress list = case (list) of
 [] -> []
 (_:_) -> (findDuplicate list)
  where
    findDuplicate :: (Eq a) => [a] -> [a]
    findDuplicate list = case (list) of
      [x]->[x]
      (x:y:xs)
        | x==y-> findDuplicate (y:xs)
        | otherwise -> x : compress (y:xs)
------------------------------------
comp2 []=[]
comp2 [x]=[x]
comp2 (x:y:xs)|x==y = comp2(y:xs)
              |otherwise = x:comp2(y:xs)
0478477
2013/06/01(土) 12:52:38.510479デフォルトの名無しさん
2013/06/01(土) 12:59:49.83ID:05NwpYWl!できればcompress "f" > "f"みたにしたかったけど、いいか。
ありがとう。
0480デフォルトの名無しさん
2013/06/01(土) 13:30:05.310481デフォルトの名無しさん
2013/06/01(土) 13:55:08.25deleteDuplicate list element = case (list) of
[] -> []
(x:xs)
| x == element -> deleteDuplicate (xs) element
| otherwise -> list
0482デフォルトの名無しさん
2013/06/03(月) 20:25:21.69ID:vG7d+PED!getnameに入れる値の構造は(c,name,age)じゃダメなのでしょうか?
[Haskellで学ぶ原理と技法」の5章で躓いた。
data Person = Person {c :: Class , name :: String , age :: Int}deriving (Show)
data Class = Student | Teacher
deriving (Show)
type Name = String
type Age = Int
--data List = [Person]
getname :: Person -> Name
getname (_ ,name ,_) = name
getage :: Person -> Age
getage (_ , _ ,age) = age
後ほど[Person]を使って多くのデータを処理したいと思っています。
下のは動くけど、[Person]出来ないし、[(class, name, age)]だけにしたいし。
data Person = Person (Class, Name , Age)
deriving (Show)
data Class = Student | Teacher
deriving (Show)
type Name = String
type Age = Int
--data List = [Person]
name :: Person -> Name
name (Person (_,name, _)) = name
age :: Person -> Age
age (Person (_ ,_,age)) = age
0483デフォルトの名無しさん
2013/06/03(月) 21:57:27.37> getnameに入れる値の構造は(c,name,age)じゃダメなのでしょうか?
> getname :: Person -> Name
> getname (_ ,name ,_) = name
型シグネチャの引数が代数データ型Personなのに、
パターンマッチしてるのがClass,Name,Ageからなるトリプルなので矛盾してる
正しくパターンマッチさせるには(Person _ name _)にする必要がある
またはtype Person = (Class, Name, Age) という定義にすればよい
でもそもそもレコード構文を使っているので
getname という関数を作らなくても name :: Person -> Nameという関数でNameを取り出せる
0484デフォルトの名無しさん
2013/06/03(月) 22:19:55.39ID:vG7d+PED!getname :: Person -> Name
getname (Person _ ,name ,_) = name
は最初に試したのですが、エラーを吐かれたので。
>正しくパターンマッチさせるには(Person _ name _)にする必要がある
確かに引数?としては(Person c, name, age)が正しいと思うのですが、
getname (Person _ ,name ,_) = name -> なぜかコンパイラーが通らない。
data Person = Person (Class, Name , Age)はname (Person (_,name, _)) = nameで動きました。
>getname という関数を作らなくても name :: Person -> Nameという関数でNameを取り出せる
確かにそうですね。
それと、ちょっと訂正。
data Person = Person {c :: Class , name :: Name , age :: Age}deriving (Show)
0485デフォルトの名無しさん
2013/06/03(月) 23:01:15.32(Person _ ,name ,_) と (Person _ name _) は違うよ
()を,で区切ってあるのはタプルというPersonとは異なる型(リストみたいなやつ)だから
0486デフォルトの名無しさん
2013/06/04(火) 07:04:07.14ID:3+1kYpm8!おお!出来た。有難うございます。
data Person = Person {c :: Class , name :: Name , age :: Age}deriving (Show)に
"," があったので引数のほうにも入れないといけないと思っていました。
0487デフォルトの名無しさん
2013/06/04(火) 07:15:35.000488デフォルトの名無しさん
2013/06/04(火) 07:41:23.74上は下の糖衣構文
data T = T A B C
a (T x _ _) = x
b (T _ y _) = y
c (T _ _ z) = z
ですが、上の定義にするとこんなことも出来る
f t@(T {b = y}) = t {b = g y}
-- f (T x y z) = T x (g y) z
0489デフォルトの名無しさん
2013/06/04(火) 11:05:46.59読みようが無いってのが実際だろうな
知ってる事が英語ならまだしも
知らない事を英語で書かれても
意味がわかるわけない
0490デフォルトの名無しさん
2013/06/04(火) 11:21:05.010491デフォルトの名無しさん
2013/06/04(火) 12:02:49.72なんとなく繋がりが分かってきた
0492デフォルトの名無しさん
2013/06/04(火) 12:11:40.24なんとなく平面上で繋がりはイメージできた
0493デフォルトの名無しさん
2013/06/04(火) 15:12:33.46ID:3+1kYpm8!なるほど。
data T = T {a::A, b::B, c::C}の時は引数にカンマがいらなくて、data T = T (A,B,C)の時は要るのか。
砂糖構文調べてみる。
0494デフォルトの名無しさん
2013/06/04(火) 19:23:25.51勘違いをしていなければいいのだが・・・
data TT = T (A,B,C)と定義されたデータ型があるときに、
let a = T (1, 2, 3) みたいに括弧とカンマを使って記述することになるのは、
「関数(データコンストラクタ T)の引数がひとつのタプルだから」だよ
0495デフォルトの名無しさん
2013/06/04(火) 20:19:53.37ID:3+1kYpm8!何か勘違いをしていたみたい。ありがとうございます。
もう一つ質問してもいいでしょうか??
例えば、
data Person = Person (Occupation, ID, Name, Age)deriving (Eq, Show)
data Occupation = Student | Teacher deriving (Eq, Show)
type ID = Int
type Name = String
type Age = Int
type List = [Person]
record :: List
record = [Person (Student, 23281, "A", 20), Person (Teacher, 12037, "B", 29),Person (Student, 37823, "C", 18),
Person (Student, 24932, "D", 19),Person (Teacher, 12917, "E", 33)]
があって、recordのデータをageの若いもん順にした。
sort :: [Int]
sort (x:xs) = sort [x | x<-xs, x <= x] ++ [x] ++ sort [x | x<-xs, x > x]を参考にしたのですが”_”のエラーがいっぱい。
別の方法もあるんでしょうか?
youngSort :: List -> List
youngSort list = case (list) of
[] -> []
((Person (_, _, _, age)):xs) -> youngSort [(Person (_, _, _, younger)) | (Person (_, _, _, younger)) <- xs, younger <= age] ++ [(Person (_, _, _, age))] ++ youngSort [(Person (_, _, _, age)) | (Person (_, _, _, older)) <- xs, older > age]
0496デフォルトの名無しさん
2013/06/04(火) 21:27:08.28youngSort list = case (list) of
[] -> []
((Person (a, b, c, age)):xs) -> youngSort [(Person (a, b, c, younger)) | (Person (a, b, c, younger)) <- xs, younger <= age]
++ [(Person (a, b, c, age))] ++ youngSort [(Person (a, b, c, older)) | (Person (a, b, c, older)) <- xs, older > age]
0497デフォルトの名無しさん
2013/06/04(火) 21:52:49.33ID:3+1kYpm8!ありがとうございます。
何となく関数型が分かってきた感じがします。
頑張ってモナドまで行こっと。
0498デフォルトの名無しさん
2013/06/04(火) 22:29:54.52◆じゃあのさん来た!◆
744:カミカゼ[]
2013/06/04(火) 21:38:46.58 ID:gQxj8a/C0
コングラッチュレーションwwwwww
ヒャッハーwwwww
ようおまいらwww俺だwwww
いいニュースだなあwwワールドカップ出場www
本当にいいニュースだ
ただ、悪いニュースがある聞きてえかおまいら?
--- 以下スレ情報 ---
高岡さんがフジ韓流ゴリ押し批判したら干されたのでウジテレビ凸
http://hayabusa.2ch.net/test/read.cgi/news4vip/1370194661/
0499デフォルトの名無しさん
2013/06/05(水) 07:07:41.05(x, y, z) == (,,) x y z
3つの引数を受けます。
data T = K (A, B, C)
K (x, y, z)
K ((,,) x y z)
このT型のKというコンストラクタ関数は一つの引数しか受けません。引数の型は(A,B,C)です。
このトリプルは別にいらない。なくして内容をKの引数にすればいい
data T = K A B C
K x y z
K (x, y, z) -- エラー。Kの一番目の引数は(A,B,C)型じゃなくてA型であるべきですから
僕は母語が日本語じゃないから変な文は許してね
0500デフォルトの名無しさん
2013/06/05(水) 14:12:51.94どこの国の人?
0501デフォルトの名無しさん
2013/06/05(水) 14:15:22.300502499
2013/06/05(水) 15:27:05.68プログラミングスレであまり語るものにならないと思うんですけど
(まあそれを言っちゃったら最初からわざわざ日本人じゃないよーとは言うべきじゃないんですけどね)
と、ごちゃごちゃ言っといて
アメリカ人です
Haskell楽しいお
0504デフォルトの名無しさん
2013/06/05(水) 18:58:40.58ID:LmcXm0ZX!data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Eq)
singleton :: a -> Tree a
singleton element = Node element Empty Empty
insert :: (Ord a) => a -> Tree a -> Tree a
insert element tree = case (tree) of
Empty -> singleton element
(Node x ltree rtree)
| x > element -> Node x (insert element ltree) rtree
| x == element -> Node element ltree rtree
| otherwise -> Node x ltree (insert element rtree)
mkTree :: (Ord a) => [a] -> Tree a
mkTree list = case (list) of
[] -> Empty
(x:xs) -> -- do not use any prelude functions
最初のxをinsertに渡したらNode x E Eになるから、残りのxsを"insert x”で出来た木に同じようにしたい。
リストの最初の値と取ってinsertに渡していくようなループってそうすればいいでしょうか?
出来ればpreludeの関数は使わない方向でおねがいしたいのですが。
0505デフォルトの名無しさん
2013/06/05(水) 19:37:33.83mkTree :: (Ord a) => [a] -> Tree a
mkTree list = case (list) of
[] -> Empty
(x:xs) -> insert x $ mkTree xs
0506デフォルトの名無しさん
2013/06/06(木) 23:14:31.03ID:E5gkHTLj!ありがとうございます。
これを元にバランス木を作ってみたいと思います。
0507デフォルトの名無しさん
2013/06/08(土) 16:21:21.49ID:qUSgaMZw!3:[]の[3]じゃなくて?
0508デフォルトの名無しさん
2013/06/08(土) 17:40:19.93map f xs はリストxsの各要素に対して関数fを適用した結果をリストとして返す
(map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn])
要素数0のリスト[]に対しては適用するリストの中身がないので[]を返す
map は f :: a -> b という関数 を 受け取って
g :: [a] -> [b] という関数を返す関数と考えるとよいかも
関数gの引数が[]のとき、返り値として最もふさわしい値は[]以外には考えにくいでしょう?
0509デフォルトの名無しさん
2013/06/08(土) 21:58:18.920510デフォルトの名無しさん
2013/06/08(土) 22:00:32.67ID:qUSgaMZw!なるほど。
[]に(3:)しても、[]に要素がないから[]を返される訳なのか。
ありがとうございます。
所で、だれかHaskell99 やってる人いないかな。62Bむずかしい。
0511デフォルトの名無しさん
2013/06/08(土) 22:04:18.77自分で tail をそのように再定義すれば済む話ではないか?
■ このスレッドは過去ログ倉庫に格納されています