view 7-Haskell/day3.hs @ 96:f548c8460d15

Add extra note about monadic-ness
author IBBoard <dev@ibboard.co.uk>
date Sun, 30 Jun 2019 15:50:33 +0100
parents 83b4f23b9df8
children 85a5e9a6ef5c
line wrap: on
line source

-- Monad tutorials:
--  * https://wiki.haskell.org/All_About_Monads
--  * https://www.haskell.org/tutorial/monads.html
--
-- Pre-existing monads: https://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#g:2

module Day3 where
    -- Build a "hash" table (actually a simple lookup in a key-value list, because hashes are hard)
    hashtable = [
            ("Phonetic", [
                ("Latin", [
                    ("alpha", "a"),
                    ("beta", "b"),
                    ("charlie", "c")
                ]),
                ("Greek", [
                    ("alpha", "α"),
                    ("beta", "β"),
                    ("gamma", "γ")
                ])
            ])
        ]
    
    -- Note: We've got to put the key first so that we can call it in-fix and supply the search key
    -- Note 2: The input value has to be a "Just x" otherwise we can "Couldn't match type 'Maybe' with []"
    -- Note 3: I can't get anything out of this other than "Just <val>", even if I include ">>= return"
    -- Example usage: Just hashtable >>= ht_lookup "Phonetic" >>= ht_lookup "Greek" >>= ht_lookup "alpha"
    -- This is monadic because "Just hashtable >>= ht_lookup "Phonetic" >>= ht_lookup "foo" >>= ht_lookup "alpha" >>= return" doesn't explode but returns Nothing
    ht_lookup :: String -> [(String, a)] -> Maybe a
    ht_lookup _ [] = Nothing
    ht_lookup search_key ((key, value):tail)
        | search_key == key = Just value
        | otherwise = ht_lookup search_key tail