2017-05-28 25 views
1

ich diese Funktion verwenden Liste der natürlichen Zahlen von Zeichenfolge in folgendem Format zu lesen: [1, 2, 3]:readMaybe Mit Liste der natürlichen Zahlen lesen

readMaybeIntList :: String -> Maybe [Int] 
readMaybeIntList line = case readMaybe line of 
          Just l -> return l 
          Nothing -> Nothing 

es funktioniert Gerade jetzt nur für ganze Zahlen - was das sein würde, korrekte Art und Weise zu überprüfen, ob die Zahlen natürlich sind? Sollte ich die Just l Klausel ändern, um zu überprüfen, ob alle Zahlen >=0 sind? Ist es eine gute Idee, Nothing von solch verschachtelten Just Klausel zurückzugeben?

+1

nicht eine sehr interessante Antwort, aber ich würde ja zu beiden Fragen sagen, die Sie erhoben – hao

+0

Sie können etwas wie 'Just l | verwenden all (> = 0) l -> ... ' – chi

+2

Ihre case-Anweisung ist äquivalent zu nur' readMaybe line' in der gleichen Weise wie 'if b then true else false' entspricht nur' b'. –

Antwort

1

Nun, wenn du gehst, return zu verwenden sowieso die Monade Instanz für Maybe aufzurufen, dann denke ich, ich würde wahrscheinlich schreiben:

import Text.Read 
import Control.Monad 

readMaybeNatList :: String -> Maybe [Int] 
readMaybeNatList line = do 
    ns <- readMaybe line 
    guard $ all (>=0) ns 
    return ns 

, die eine idiomatische Anwendung des Maybe Monade ist. Ob es klarer als die explizite Pattern-Matching (und Monade frei) Alternative:

readMaybeNatList' :: String -> Maybe [Int] 
readMaybeNatList' line = 
    case readMaybe line of 
    Just ns | all (>=0) ns -> Just ns 
    _ -> Nothing 

ist wahrscheinlich eine Frage der Stellungnahme und Zielgruppe.

1

könnten Sie do -Notation und guard von Control.Monad verwenden, um die übermäßige Musteranpassung zu vermeiden:

import Text.Read 
import Control.Monad 


readMaybeNatural :: String -> Maybe Int 
readMaybeNatural str = do 
    n <- readMaybe str 
    guard $ n >= 0 
    return n 


readMaybeNaturals :: String -> Maybe [Int] 
readMaybeNaturals = 
    sequence . map readMaybeNatural . words 
+0

Auch, Sequenz. map f' = 'traverse f' –

+0

das vergesse ich immer, danke für den Hinweis! –

Verwandte Themen