2016-04-03 16 views
0

Ich versuche, einen Wert Maybe von einer Funktion zurückzugeben, die Do-Notation verwendet, aber ich kann nicht scheinen, um es zu arbeiten. Diese Funktion nimmt einen String (Der "Dateiname") und einen Pfad in ...Wie kann ich einen Maybe-Wert aus der Do-Notation in PureScript zurückgeben?

findIn :: String -> Path -> Maybe Path 
findIn search start = do 
    file <- ls start 
    if ((filename file) == search) 
     then Just file 
     else Nothing 

Wo ...

ls :: Path -> Array Path 
filename :: Path -> String 

Aber ich den Fehler halten suchen immer „Count nicht Typ Array entsprechen mit type Maybe ", also sieht es so aus, als ob der Compiler die do-Notation erwartet, um ein Array zurückzugeben. Wie würde ich einen möglichen Wert zurückgeben?

Antwort

2

Sie können Monaden nicht so mischen.

Wenn Sie schreiben:

file <- ls start 

es ein bisschen wie zu sagen ist „für jeden Wert file im Array ...“, so dass Sie im Rahmen von mehreren möglichen Werten sind.

Aber dann ist der Rest des Codes im Kontext von Maybe, die nur einen (oder Null) Werte verarbeiten kann.

Im Modul Data.Foldable gibt es eine find Funktion, die den Hauptteil der Arbeit Ihrer Hauptfunktion erledigt, indem sie nach einem einzelnen Element sucht, das einigen Kriterien entspricht. Sein tatsächlicher Typ ist allgemeiner, aber wenn gezwungen, es ist so zu Arrays:

find :: forall a. (a -> Boolean) -> Array a -> Maybe a 

Dann können Sie einfach schreiben:

findIn search start = find (\x => x == search) $ ls start 
+0

Ok, ich glaube, ich verstehe. Also muss die Notation ein Array zurückgeben, und alle Ausdrücke zielen darauf ab, auf diesen Arrays zu filtern und zu mappen. – Albtzrly

+0

Ja, das stimmt. Wenn Sie ein 'Maybe' zurückgeben wollen, dann muss der' Do'-Block alles über 'Maybe' sein. Ich habe meine Antwort ein wenig aktualisiert. –

+0

Vielen Dank für die Klärung. Diese Aussage darüber, im "Kontext von Maybe" und im "Kontext vieler möglicher Werte" zu stehen, macht Sinn. So habe ich noch nie darüber nachgedacht. – Albtzrly

0

Ok, ich habe etwas gefunden, das funktioniert, aber ich bin mir nicht sicher, ob es ideal ist.

Es sieht also so aus, als würde die Do-Notation einen Wert vom Typ Array (Maybe Path) zurückgeben.