嘗試在this頁面上擴展「Maybe monad」示例。他們查找表phonebook
:Haskell查找表返回函數
phonebook :: [(String, String)]
phonebook = [ ("Bob", "01788 665242"),
("Fred", "01624 556442"),
("Alice", "01889 985333"),
("Jane", "01732 187565") ]
,有鏈單子例子:
getRegistrationNumber :: String -- their name
-> Maybe String -- their registration number
getRegistrationNumber name =
lookup name phonebook >>=
(\number -> lookup number governmentalDatabase)
如果我們想返回的功能會發生什麼(即然後返回一個特定類型的)呢?因此,從他們的例子延伸出來,而不是查找註冊號碼,我們希望查找他們的年齡,他們的郵政編碼,或財產稅支付的年份。鑑於這些例子,INT
似乎適用於前兩個,最後一個List of Ints
。 第一個問題:由於查找表有一個類型,函數的所有返回類型是否必須是相同類型?我假設是,但我不確定,因此下一個問題。
可以說我們寫這些'找到'函數返回相同的類型[Int]
。也許像這些:
getAge :: String -> Maybe [Int]
getAge phoneNumberString =
lookup name phonebook >>==
(\phoneNumberString -> lookup phoneNumberString governmentalAgeDatabase)
getZip :: String -> Maybe [Int]
getZip phoneNumberString =
lookup name phonebook >>==
(\phoneNumberString -> lookup phoneNumberString governmentalZipCodeDatabase)
getTaxPaidYears :: String -> Maybe [Int]
getTaxPaidYears phoneNumberString =
lookup name phonebook >>==
(\phoneNumberString -> lookup phoneNumberString governmentalTaxYearDatabase)
現在,假設每個的*Database
S的返回[Int]
類型,第二個問題我們如何寫一個功能類似lookupPersonsInformation
,將返回從什麼在輸入中鍵入相應的信息字符串,並給出一個返回適當的函數的查找,返回請求的信息?以下是我努力使工作:
lookupAppropriateFunction :: [(String, String -> [Int])] --Here I want the second part
-- of the tuple to be the functions
lookupAppropriateFunction = [ ("age", getAge),
("zip", getZip),
("taxes", getTaxPaidYears) ]
lookupPersonsInformation :: String -> Maybe [Int]
lookupPersonsInformation nameAndInfo =
lookup (words nameAndInfo!!0) >>=
(\phoneNumberString -> lookup (words nameAndInfo!!1) lookupAppropriateFunction)
-- >> lookupPersonsInformation "Bob age"
[53] --Bob's age
-- >> lookupPersonsInformation "Fred zip"
[28202] --Fred's age
-- >> lookupPersonsInformation "Alice taxes"
[2010,2011,2013] --Alice's paid taxes years, It looks like she skipped 2012 :)
很明顯的錯誤進行到底的Nothing
傳播,但我不知道該如何採取將其應用到一個高階函數的下一個步驟。它是更多的使用words
解析或查找表的結構,我想回到一個function`
每個人都有一個年齡,一個郵政編碼和稅務信息(據推測)。因此,'lookupPersonInfo'應該有'String - > Maybe PersonInfo'類型,其中'data PersonInfo = PersonInfo {personName :: String,personAge :: Int,personTaxYears :: [Int]}'。然後你有'fmap personAge(lookupPersonInfo「bob」)''''fmap personName(lookupPersonInfo「bob」)'等等 – user2407038 2014-10-02 03:26:46