38. リスト型リスト型
内包表記など
Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude> [(x,y,z) | x <- [1..100], y <- [1..100], z <- [1..100], (z^2 == x^2
+ y^2)]
[(3,4,5),(4,3,5),..,(45,60,75),(48,14,50),(48,20,52),(48,36,60),(48,55,73),
(48,64,80),(51,68,85),(52,39,65),(54,72,90),(55,48,73),(56,33,65),(56,42,70),
(57,76,95),(60,11,61),(60,25,65),(60,32,68),(60,45,75),(60,63,87),
(60,80,100),
(63,16,65),(63,60,87),(64,48,80),(65,72,97),(68,51,85),(70,24,74),(72,21,75),
(72,30,78),(72,54,90),(72,65,97),(75,40,85),(76,57,95),(77,36,85),(80,18,82),
(80,39,89),(80,60,100),(84,13,85),(84,35,91),(96,28,100)]
Prelude> take 5 [1,5..]
[1,5,9,13,17]
38
39. タプル型タプル型
(,)が2引数関数
タプルの中のデータの型は自由
data (,) a b = (,) a b
Prelude> :t (,)
(,) :: a -> b -> (a, b)
Prelude> (,) 1 "AAA"
(1,"AAA")
Prelude> :t (,) 1 "AAA"
(,) 1 "AAA" :: Num a => (a, [Char])
39
46. ユーザー定義型ユーザー定義型
関数をとる型の定義
data EpronMan a b c = EpronMan
{
pocketNum :: Int
, yarouName :: String
, f :: (a -> b -> c)
}
Prelude> let epm = EpronMan 10 "新作" (+)
Prelude> :t epm
epm :: Num c => EpronMan c c c
46
61. 畳み込み畳み込み
ある集合の値を特定の値にまとめる
Prelude> :t foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Prelude> foldr (+) 0 [1,2,3] -- 1 + (2 + (3 + 0))
6
Prelude> :i []
instance Foldable [] -- Defined in ‘Data.Foldable’
61
70. Bounded – IntBounded – Int
上限と下限をもつ
Prelude> :i Int
instance Bounded Int -- Defined in ‘GHC.Enum’
Prelude> maxBound :: Int
9223372036854775807
Prelude> (maxBound :: Int) + 1
-9223372036854775808
Prelude> minBound :: Int
-9223372036854775808
70
71. Bounded – IntegerBounded – Integer
際限なく利用可能
maxBound :: Integer
<interactive>:14:1: error:
• No instance for (Bounded Integer)
arising from a use of ‘maxBound’
• In the expression: maxBound :: Integer
In an equation for ‘it’: it = maxBound :: Integer
71
74. サブタイプ多相サブタイプ多相
型によって動作を変える
class Yabai a where
hagasu :: a -> String
data Epron = Epron deriving(Show)
data Hadaka = Hadaka deriving(Show)
instance Yabai Epron where
hagasu v = "Yamete ===> " ++ show(v)
instance Yabai Hadaka where
hagasu v = "Marumie ===> " ++ show(v)
74
79. FunctorFunctor
純粋な関数(a -> b)とファンクタ値(f a)を与える
(f a)のaを(a -> b)へ適用し、ファンクタ値(f b)を返す
-- Functor (f :: * -> *)
fmap :: Functor f => (a -> b) -> f a -> f b
79
80. fmapfmap
not関数を、Justに包まれている値へ適用できた
Prelude> :t not
not :: Bool -> Bool
Prelude> :t fmap not
fmap not :: Functor f => f Bool -> f Bool -- f にJustで固定してみる
Prelude> :t fmap not (Just True)
fmap not (Just True) :: Maybe Bool
Prelude> fmap not (Just True)
Just False
80
83. MonadMonad
returnでmに包む
mに包まれたaを取り出し(a -> m b)関数へaを適用する
適用した結果bをmに包んで返す
class Applicative m => Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
83