2016-09-18 45 views
0

我正在學習哈斯克爾「是」的數據結構和寫了下面的:Haskell'無論'數據類型和可讀性?

type PhoneBook = [(String, String)] 
createPhoneBook :: PhoneBook --Use function to generate instance of type 
createPhoneBook = [("betty","1212-232"), 
        ("billy", "3443-434"), 
        ("derdre", "3232-221")] 

data PresentInPhoneBook = Present | NotPresent deriving (Show, Eq) --Either 
type IsPresent = String 
type IsNotPresent = String 

checkPhoneBook :: String -> PhoneBook -> Either IsPresent IsNotPresent 
checkPhoneBook name pb = if foldRes == True then Left "Match" else Right "No Match" 
where 
    foldRes = foldl (\acc (key,value) -> if key == name then True else acc) False pb 

是否有任何改進,使代碼更易讀?

我很欣賞它的一個簡單的例子,但我只是在這個階段學習。

+1

SO不是一個很好的代碼審查網站,但是在我看來,你希望'checkPhoneBook :: String - > PhoneBook - > Bool'或'... - > PresentInPhoneBook'也可以,如果你有理由對該財產使用特殊類型。 – jberryman

+3

[Code Review](http://codereview.stackexchange.com/)可能是一個更好的地方來問這個問題。 – bwroga

+2

當您只打算使用一個值「Match」(或「No Match」')時,爲什麼要爲'IsPresent'(或者'IsNotPresent')使用一個類型與'String'一樣多的值?比如'type IsPresent =();使它們只有一個值的類型更有意義。鍵入IsNotPresent =()'。但是你會得到'Either()()',這與'Bool'或'PresentInPhoneBook'的機器基本相同,但對人類來說不太可讀。所以在所有這些重構的最後,你最終會選擇這兩種類型中的一種,而不是使用'Either'或'IsPresent' /'IsNotPresent'類型。 –

回答

1

我會寫這樣的:

import Data.Maybe (isJust) 

checkPhoneBook :: String -> PhoneBook -> PresentInPhoneBook 
checkPhoneBook name pb = isJust (lookup name pb) 

沒有理由使用有checkPhoneBook回報Either IsPresent IsNotPresent。只需返回PresentInPhoneBook。在這種情況下,返回Bool也是可以的。還要記下lookup(我以上使用過)。它返回一個Maybe的值,所以你可以用它來查找一個名字,並找出電話簿中是否存在一個名字。

+0

使用'Either'有什麼用處? –

+0

@barbrac當你必須爲這兩種情況中的每一種返回一些值時。 – redneb

+0

@barbrac可以考慮'或者b'作爲'Maybe b'的泛化。 'Right y'和'Just y'的用法相同,但是'Left x'允許你爲每個可能的錯誤指定一個不同的值'x :: a',而不是僅僅一個catch-all返回值' Nothing'。 – chepner

2

這是

if foldRes == True then 

意外,還是你覺得它不僅僅是

if foldRes then 

在後一種情況更可讀,我會建議

if (foldRes == True) == True then 

必須擴展性更強,可讀性更強。

+0

一個非常有效的評論(它讓我很困惑,爲什麼許多人認爲這是一個好主意,通過冗餘陳述冗餘的真實性),但不是一個答案。 – leftaroundabout

+0

@leftaroundabout問題是爲了使代碼更具可讀性的改進。 – Ingo

+0

嗯,我想你是對的。這更多的是這裏放錯地方的問題...... – leftaroundabout