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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/03/23(土) 12:34:19.09
haskell.org
ttp://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.59
いいよそれで
0413デフォルトの名無しさん2013/05/14(火) 00:03:59.85
>>408
述語論理で使う∀も同じ意味だと思うが
0414デフォルトの名無しさん2013/05/14(火) 01:03:52.84
TSX命令が使えるようになったらSTMは単にTMと呼ばれるようになるのだろうか? o(^-^)o
0415デフォルトの名無しさん2013/05/14(火) 06:53:54.53ID:XUYxe5VW!
>>412
ありがと。
0416デフォルトの名無しさん2013/05/14(火) 07:50:37.25
>>411
全然違う
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.32
それパターンマッチかガードと何の関係あんの
0419デフォルトの名無しさん2013/05/15(水) 00:51:38.29
>>417

412,416の意見に惑わされるな
他人の意見に惑わされるな



お前がどうするかだ! お前がどう動くかだ!
お前がどうするかだ! お前がどう動くかだ!!

決めるのは誰だ? やるのは誰だ? 行くのは誰だ?
そう お前だ! お前が舵を取れ!
お前が行け! お前が走れ! お前が行くから道になる
前へ 前へ 前へ 前へ ただただひたすら前へ突き進めばいい
わかるか! わかるか! お前が決めろ お前がしっかり舵を取れ
0420デフォルトの名無しさん2013/05/15(水) 09:48:34.34
舵取りはお前にまかせたぞ!
0421デフォルトの名無しさん2013/05/15(水) 11:06:47.11
長渕かよ
0422デフォルトの名無しさん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.26
本物のプログラマはJavaで量り売り
0425デフォルトの名無しさん2013/05/15(水) 16:47:21.37
>>420
お前が消えて喜ぶ奴にお前のオールを任せるな
0426デフォルトの名無しさん2013/05/15(水) 19:57:55.33
手続き型と関数型の二択だと思ってる>>422がバカ
0427デフォルトの名無しさん2013/05/15(水) 22:24:12.22
闇のProlog一族はどうぞ安らかにお眠りください
0428デフォルトの名無しさん2013/05/15(水) 22:44:11.57
プログラムが組めないのですが誰か教えてください
2枚目を参考にしながら
よろしくお願いします
http://i.imgur.com/pqa6Bk4.jpg
http://i.imgur.com/R8FsYBJ.jpg
0429デフォルトの名無しさん2013/05/15(水) 22:45:03.16
追記:(1)だけでいいです
0430デフォルトの名無しさん2013/05/16(木) 00:07:18.35
>>417
パターンマッチは値コンストラクタをマッチさせる。その例だと
f 2 = True
f x = False
みたいに書くのがパターンマッチ
f x | x == 2 = True
| otherwise = False
みたいに引数の性質によって場合分けするのがガード
型を確定どうのは型推論の話だと初学者がマジレスしてみるテスト
0431デフォルトの名無しさん2013/05/16(木) 03:31:22.70
アスペクト志向だかサブジェクト志向だかプログラミングってどうなったの?
0432デフォルトの名無しさん2013/05/16(木) 04:31:47.77
たぶん純粋関数型よりは普及している
0433デフォルトの名無しさん2013/05/16(木) 07:36:44.34
AOPはもうあって当たり前の技術
0434デフォルトの名無しさん2013/05/16(木) 07:57:15.87
>>433
「あって」とは?
0435デフォルトの名無しさん2013/05/16(木) 08:06:05.35
その辺のプロジェクトに
0436デフォルトの名無しさん2013/05/16(木) 11:53:47.98
>>430
fって値コンストラクターなん?
0437デフォルトの名無しさん2013/05/16(木) 17:45:58.75
違う
0438デフォルトの名無しさん2013/05/16(木) 17:51:46.01
パターンマッチの例に2を使ってるのがイマイチなんじゃ。

comb :: 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.33
>>427
Prologと関数型言語は持ちつ持たれつ進んでいくのが一番いいよ。
0440デフォルトの名無しさん2013/05/16(木) 19:12:04.82
AOP研究者は最近Feature Oriented Programming(FOP)に鞍替えしてると聞く
0441デフォルトの名無しさん2013/05/17(金) 13:00:50.42
      ☆ チン     マチクタビレタ〜
                        マチクタビレタ〜
       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ヽ ___\(\・∀・) < Haskell Platform 2013.2.0.0 まだ〜?
            \_/⊂ ⊂_ )   \_____________
          / ̄ ̄ ̄ ̄ ̄ ̄ /|
       | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
       |  愛媛みかん |/
0442デフォルトの名無しさん2013/05/19(日) 23:44:52.16
話題は?
0443デフォルトの名無しさん2013/05/20(月) 00:08:19.53
オヌヌメの開発環境を教えて下さい
0444デフォルトの名無しさん2013/05/20(月) 07:00:45.93
>>443
Emacs + haskell-mode
0445デフォルトの名無しさん2013/05/20(月) 07:09:44.51
>>443
vim + hdevtools
0446デフォルトの名無しさん2013/05/20(月) 15:32:57.02
hdevtoolsのウリは?
0447デフォルトの名無しさん2013/05/20(月) 20:17:09.78
>>446
http://hackage.haskell.org/package/hdevtools
0448デフォルトの名無しさん2013/05/20(月) 23:00:40.75
最近は何でもsublime text使っときゃ間違いないみたいになりつつあるから、
sublime textがいいかもな
0449デフォルトの名無しさん2013/05/21(火) 06:55:43.87
>何でもsublime text使っときゃ間違いないみたいになりつつある
初耳だな
0450デフォルトの名無しさん2013/05/21(火) 08:41:53.58
俺も初めて聞いた。
何でもかんでもvim使えとかemacs使えという人ならいっぱいいるけどww
0451デフォルトの名無しさん2013/05/21(火) 09:22:10.27
sublime用のhaskellプラグインはemacsのhaskell-modeより開発が活発
hoogleとかghs-modには大分前から対応してる
0452デフォルトの名無しさん2013/05/21(火) 09:56:09.26
haskell-modeはシンプルだから活発に開発する段階はとうに過ぎてるねぇw
0453デフォルトの名無しさん2013/05/21(火) 12:39:49.89
haskell-modeはお世辞にも使いやすいとか、かゆいところに手が届くってわけではないが、
Emacs 自体が使いやすいから、haskell-mode の開発が止まっても、仕方なく使い続けてる。

Haskell で C# や Java みたいに GUI パーツをペタペタ貼ったり、
ロジックをグラフィカルに定義できる様になれば、専用の開発環境に移るかもしれん。
さすがに、そういうのが Emacs で気持よくできるようになるとは思えないからね。
0454デフォルトの名無しさん2013/05/21(火) 14:03:05.09
マクロがhaskellで記述できるエディタってあったりするの?
0455デフォルトの名無しさん2013/05/21(火) 15:11:15.55
義ってどうなったの?
0456デフォルトの名無しさん2013/05/21(火) 19:27:05.11
>>455
http://hackage.haskell.org/package/yi-0.6.5.0
最終アップデートが2012年3月
それまでだいたい半年に1回くらいのペースで定期的にアップデートしてきたのに・・・
0457デフォルトの名無しさん2013/05/21(火) 19:32:41.53
と思ったが、GitHub ではちょくちょく更新されてるから、開発は続いているみたい

俺は Linux だからいいけと、Windows で簡単にインストールできるようにならんと、流行らんな
0458デフォルトの名無しさん2013/05/30(木) 18:55:48.24
話題は?
0459デフォルトの名無しさん2013/05/30(木) 20:38:48.49ID:WFTkAEQe!
質問でも良かな?
0460デフォルトの名無しさん2013/05/30(木) 21:18:33.96
>>459
どぞ
0461デフォルトの名無しさん2013/05/30(木) 21:36:00.73ID:WFTkAEQe!
ありがとう。最近haskellを始めた。
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.13
どう詰まったのかとか、そういうのは」ないのかね
0463デフォルトの名無しさん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.04
initを使う
0465デフォルトの名無しさん2013/05/30(木) 23:11:33.94
>>463
[] -> [[]] を[] -> []
とするんだよ。
0466デフォルトの名無しさん2013/05/30(木) 23:25:30.45ID:WFTkAEQe!
なぜ、[[]]が[]なのだろう?
[a] : [[]] -> [[a], ... []]にならないのだろうか?
[a]:[]はエラーな気がするのだが。
0467デフォルトの名無しさん2013/05/30(木) 23:28:24.79
>>466
なぜ、[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.94
data [] a = [] | a : [a]
0470デフォルトの名無しさん2013/05/31(金) 19:54:30.74ID:8/3B9ldc!
*Main> compress "aaabbbbvvvcccaaaddd"
"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
>>470
エラーメッセージ読めよ。
0472デフォルトの名無しさん2013/05/31(金) 23:36:01.66
compress [] = []
compress (x:xs) = reverse $ foldl (\a y -> if head a == y then a else (y:a)) [x] xs

どうもすっきりしない…
[]を特別扱いしない方法はないでしょうか?
0473デフォルトの名無しさん2013/05/31(金) 23:58:00.94
if head a == y then a else (y:a) だって、
head a と y が等しい場合を特別扱いしてるくせに・・・
0474デフォルトの名無しさん2013/06/01(土) 00:50:55.28
ポイントフリーの達人の出番か
0475デフォルトの名無しさん2013/06/01(土) 11:24:15.57ID:05NwpYWl!
deleteDuplicateが list=[]の時、終了しないからNonexhaustiveになるんだと思う。
終了させるにはどうすれば良いかな。
試しに[x]->[x]入れたら無限に津尽くし。
0476デフォルトの名無しさん2013/06/01(土) 12:10:42.80
yがいらんだろ。
0477デフォルトの名無しさん2013/06/01(土) 12:51:27.14
compress :: (Eq a) => [a] -> [a]
compress 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)
04784772013/06/01(土) 12:52:38.51
ごめん、失敗した。
0479デフォルトの名無しさん2013/06/01(土) 12:59:49.83ID:05NwpYWl!
もうcompress のlistに[x]->[]で強制的に終わらせることにした。
できればcompress "f" > "f"みたにしたかったけど、いいか。
ありがとう。
0480デフォルトの名無しさん2013/06/01(土) 13:30:05.31
(>>=take 1) . Data.List.group
0481デフォルトの名無しさん2013/06/01(土) 13:55:08.25
deleteDuplicate :: (Eq a) => [a] -> a -> [a]
deleteDuplicate 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
>>482
> 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!
>>483
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
>>484
(Person _ ,name ,_) と (Person _ name _) は違うよ
()を,で区切ってあるのはタプルというPersonとは異なる型(リストみたいなやつ)だから
0486デフォルトの名無しさん2013/06/04(火) 07:04:07.14ID:3+1kYpm8!
>>485
おお!出来た。有難うございます。
data Person = Person {c :: Class , name :: Name , age :: Age}deriving (Show)に
"," があったので引数のほうにも入れないといけないと思っていました。
0487デフォルトの名無しさん2013/06/04(火) 07:15:35.00
関数の引数にカンマは要らんよ
0488デフォルトの名無しさん2013/06/04(火) 07:41:23.74
data T = T {a :: A, b :: B, c :: C}
上は下の糖衣構文
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.01
っ辞書
0491デフォルトの名無しさん2013/06/04(火) 12:02:49.72
パスカルの三角形とか4次元モデル(立方体の中に立方体)をイメージしたら
なんとなく繋がりが分かってきた
0492デフォルトの名無しさん2013/06/04(火) 12:11:40.24
カルノー図っての描ければ
なんとなく平面上で繋がりはイメージできた
0493デフォルトの名無しさん2013/06/04(火) 15:12:33.46ID:3+1kYpm8!
>>487,488
なるほど。
data T = T {a::A, b::B, c::C}の時は引数にカンマがいらなくて、data T = T (A,B,C)の時は要るのか。
砂糖構文調べてみる。
0494デフォルトの名無しさん2013/06/04(火) 19:23:25.51
>>493
勘違いをしていなければいいのだが・・・

data TT = T (A,B,C)と定義されたデータ型があるときに、
let a = T (1, 2, 3) みたいに括弧とカンマを使って記述することになるのは、
「関数(データコンストラクタ T)の引数がひとつのタプルだから」だよ
0495デフォルトの名無しさん2013/06/04(火) 20:19:53.37ID:3+1kYpm8!
>>494
何か勘違いをしていたみたい。ありがとうございます。
もう一つ質問してもいいでしょうか??
例えば、
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.28
youngSort :: [Person] -> [Person]
youngSort 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!
>>496
ありがとうございます。
何となく関数型が分かってきた感じがします。
頑張ってモナドまで行こっと。
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
>>499
どこの国の人?
0501デフォルトの名無しさん2013/06/05(水) 14:15:22.30
Land of LISP
05024992013/06/05(水) 15:27:05.68
>>500
プログラミングスレであまり語るものにならないと思うんですけど
(まあそれを言っちゃったら最初からわざわざ日本人じゃないよーとは言うべきじゃないんですけどね)
と、ごちゃごちゃ言っといて
アメリカ人です

Haskell楽しいお
0503デフォルトの名無しさん2013/06/05(水) 17:33:22.42
>>502
日本語上手すぎるだろ
日本に何年住んでいるの?

>>501
ご近所さんだな
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.83
こういうこと?
mkTree :: (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!
>>505
ありがとうございます。
これを元にバランス木を作ってみたいと思います。
0507デフォルトの名無しさん2013/06/08(土) 16:21:21.49ID:qUSgaMZw!
何故、map (3:) []は[]?
3:[]の[3]じゃなくて?
0508デフォルトの名無しさん2013/06/08(土) 17:40:19.93
>>507
map 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.92
tail []も[]にしてほしかったね
0510デフォルトの名無しさん2013/06/08(土) 22:00:32.67ID:qUSgaMZw!
>>508
なるほど。
[]に(3:)しても、[]に要素がないから[]を返される訳なのか。
ありがとうございます。


所で、だれかHaskell99 やってる人いないかな。62Bむずかしい。
0511デフォルトの名無しさん2013/06/08(土) 22:04:18.77
>>509
自分で tail をそのように再定義すれば済む話ではないか?
■ このスレッドは過去ログ倉庫に格納されています