キーに対応する値をすばやく参照するためのデータ構造。ハッシュ表ともいう。ハッシュテーブルは連想配列や集合の効率的な実装
ハッシュ関数の応用。添字を数字ではなくハッシュ値にすることで、検索を一意にして検索の速度を上げる(理論的にはO(n))
キーに対応する値をすばやく参照するためのデータ構造。ハッシュ表ともいう。ハッシュテーブルは連想配列や集合の効率的な実装
ハッシュ関数の応用。添字を数字ではなくハッシュ値にすることで、検索を一意にして検索の速度を上げる(理論的にはO(n))
Prelude> fmap ( \ x -> [x]) (Just 4) Just [4]
Prelude> import Control.Applicative Prelude Control.Applicative> :t liftA2 liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
Prelude Control.Applicative> liftA2 (:) (Just 3) (Just [4]) Just [3,4] Prelude Control.Applicative> (:) <$> Just 3 <*> Just [4] Just [3,4]
こういうふうにアプリカティブ値から単一のアプリカティブ値を組み立てることが出来る。再帰でsequenceAを呼び出している。
import Control.Applicative sequenceA :: (Applicative f) => [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) <$> x <*> sequenceA xs main = do print $ sequenceA [Just 1, Just 2]
Prelude Control.Applicative> sequence [Just 1, Just 2] Just [1,2] Prelude Control.Applicative> sequence [Just 1, Just 2, Just 3] Just [1,2,3] Prelude Control.Applicative> sequence [Just 1, Just 2, Just 3, Just 4] Just [1,2,3,4]
import Control.Applicative sequenceA :: (Applicative f) => [f a] -> f [a] sequenceA = foldr (liftA2 (:)) (pure []) main = do print $ sequenceA [Just 1, Just 2] print $ sequenceA [Just 3, Just 2, Just 1] print $ sequenceA [Just 3, Nothing, Just 1] print $ sequenceA [[1,2,3],[4,5,6]] print $ sequenceA [[1,2,3],[4,5,6],[3,4,4],[]] -- equal print $ (:) <$> Just 1 <*> sequenceA [Just 2] print $ (:) <$> Just 1 <*> ((:) <$> Just 2 <*> sequenceA []) print $ (:) <$> Just 1 <*> ((:) <$> Just 2 <*> Just []) print $ (:) <$> Just 1 <*> Just [2]
なんとなくのアプリカティブ
Prelude Control.Applicative> (++) <$> Just [1] <*> Just [2] Just [1,2] Prelude Control.Applicative> sequence [(+3), (+2), (+1)] 3 [6,5,4]
Prelude Control.Applicative> map ( \ f -> f 7) [(>4),(<10),odd] [True,True,True] Prelude Control.Applicative> and $ map ( \ f -> f 7) [(>4),(<10),odd] True
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] Prelude Control.Applicative> [[x,y] | x <- [1,2,3], y <- [4,5,6], z <- []] [] Prelude Control.Applicative> [[x,y,z] | x <- [1,2,3], y <- [4,5,6], z <- []] []
I/Oアクションもsequenceでまとめることが出来る
非決定性計算 http://sicp.iijlab.net/fulltext/x430.html
Prelude Control.Applicative> sequence [getLine, getLine] hello world ["hello","world"]
プリカティブファンクターを使えば、I/Oを伴う計算、非決定性計算、失敗するかもしれない計算、......などなど、多種多様な計算をアプリカティブ・スタイルを使って組み合わせることができる
Prelude Control.Applicative> getZipList $ ZipList [(+1),(*100),(*5)] <*> ZipList [1,2,3] [2,200,15]
Haskell の newtype キーワードは、まさにこのような1つの型を取り、それ を何かにくるんで別の型に見せかけたいという場合のために作られたもの
dataと同じようにderivingで自動導出できる
newtype を使って型クラスのインスタンスを作る
newtype で作った型にはパターンマッチも使える
newtype と遅延評価
Prelude Control.Applicative> head [3,4,5,undefined,2,undefined] 3
newtypeの使い方
-- data CoolBool = CoolBool { getCoolBool :: Bool } newtype CoolBool = CoolBool { getCoolBool :: Bool } helloMe :: CoolBool -> String helloMe (CoolBool _ ) = "hello" main = do print $ helloMe undefined
dataとnewtypeは違うよねっていう話。
newtype CharList = CharList { getCharList :: [Char] }
CharListとCharをリスト連結することは不可能。
Haskell の型クラスは、同じ振る舞いをする型たちに共通のインターフェイスを提供するために使われている→どんな共通点があるだろうか。
モノイド→結合的な性質があること(数学的な概念)
モノイドは圏論の一種
semigroupは半群
Mekanik Destruktiw Kommandoh [12 inch Analog]