2016-09-18 9 views
0

私はHaskellで 'のいずれかのデータ構造を学んだし、次のように書かれている:Haskell 'Either'データ型と可読性?

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

[コードレビュー](http://codereview.stackexchange.com/)がこれを尋ねる良い場所かもしれません。 – bwroga

+2

1つの値 '' Match ''(resp。' "No Match" ')だけを使用する予定がある場合、IsPresent(' 'IsNotPresent')に対して' String'と同じ数の型を使うのはなぜですか?最初に 'type IsPresent =();のように1つの値しか持たない型にする方がはるかに意味があります。タイプIsNotPresent =() '。しかし、 'Bool'や' PresentInPhoneBook'と基本的に同じですが、人間には読みにくい 'Either()()'が得られます。だから、これらのすべてのリファクタリングの終わりに、 'Either'や' IsPresent'/'IsNotPresent'タイプを使う代わりに、これらの2つのタイプのうちの1つになります。 –

答えて

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

「どちらか」を使用するとどのようなシナリオが役立ちますか? –

+0

@barbrac 2つのケースのそれぞれについて値を返す必要があるとき。 – redneb

+0

@barbrac「おそらくb」の一般化として「どちらかb」と考える。 'Right y'は' Just y'と同じように使われますが、 'Left x'は' catch'の戻り値の一つではなく、考えられるエラーごとに異なる値 'x :: a'を指定することを可能にします。何もない。 – chepner

2

偶然この

if foldRes == True then 

です、またはあなただけの

if foldRes then 

後者の場合に比べて、それがより読みやすい見つけるか、私はどの必見

if (foldRes == True) == True then 

を提案したいです拡張によって、さらに読みやすくなります。

+0

非常に有効なコメントです(冗長で重複した真実を述べることは非常に多くの人には良い考えであるが、それは答えではありません)。 – leftaroundabout

+0

@leftaroundについての質問は、コードを読みやすくするための改善のためでした。 – Ingo

+0

まあ、あなたが正しいと思います。それはここに間違って配置されている問題です – leftaroundabout