Skip to content

Instantly share code, notes, and snippets.

@tan-yuki
Last active August 29, 2015 14:04
Show Gist options
  • Save tan-yuki/e0425953452fcbe77563 to your computer and use it in GitHub Desktop.
Save tan-yuki/e0425953452fcbe77563 to your computer and use it in GitHub Desktop.
haskell_15day.md

データ型

++

infixr 5 ++ -- infixr: 結合度
(++) :: [a] -> [a] -> [a]
[]     ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)

++は標準で用意されている

:-:

infixr 5 :-:
data List a = Empty | a :-: (List a) deriving (Show, Read, Eq, Ord)

^++

(^++) :: List a -> List a -> List a
Empty      ^++ ys = ys
(x :-: xs) ^++ ys = x :-: (xs ^++ ys)

使用例:

let a = 3 :-: 4 :-: 5 :-: Empty
let b = 6 :-: 7 :-: Empty

let c = a ^++ b
-- 3 :-: 4 :-: 5 :-: 6 :-: 7 :-: Empty

二分木

二分木をつくろう!

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)

-- root作成
singleton :: a -> Tree a
singleton x = Node x EmptyTree EmptyTree

-- 要素aをTreeに挿入
treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x EmptyTree => singleton x
treeInsert x (Node a left right)
  | x == a = Node x left right
  | x <  a = Node a (treeInsert x left) right
  | x >  a = Node a left (treeInsert x right)


-- Treeに要素aが入っているかどうか
treeElem :: (Ord a) => a -> Tree a -> Bool
treeElem x EmptyTree = False
treeElem x (Node a left right)
 | x == a = True
 | x <  a = treeElem x left
 | x >  a = treeElem x right
 
-- 二分木を作成
let nums = [8, 6, 4, 1, 7, 3, 5]
let numsTree = foldr treeInsert EmptyTree nums
  • Q. なんでfoldr?
    • foldr: foldr (関数)(初期値)(配列)
      • 関数に初期値と配列の一要素が引数として実行される
foldr treeInsert EmptyTree [8, 6, 4, 1, 7, 3, 5]
-- (treeInsert 5 (treeInsert3 .... (treeInsert 8 EmptyTree)))))))

foldl treeInsert EmptyTree [8, 6, 4, 1, 7, 3, 5]
-- (treeInsert (treeInsert EmptyTree 8) 6) ..... 5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment