2016-04-03 12 views
0

Notu kullanan bir işlevden bir Belki değeri döndürmeye çalışıyorum, ancak çalışmayı başaramıyorum. Bu fonksiyon, bir dize ("filename") ve aramak için Path ...PureScript'te bir not değerinin bir nottan nasıl döndürebilirim?

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

...

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

alır Ama Tip Diziyi eşleşmiyor Kont" hata almaya devam Belki de "ile" derleyicinin bir diziyi döndürmek için notasyon yapmasını beklediğine benziyor. Belki bir değeri nasıl iade edebilirim?

cevap

2

Monad'ları böyle karıştırmazsınız.

Eğer yazarken:

file <- ls start 

biraz demek gibi "dizisindeki her değer file için ..." Birden olası değerleri bağlamında bu yüzden.

Ancak kodun geri kalanı yalnızca bir (veya sıfır) değeri kaldırabilen Maybe bağlamındadır.

Data.Foldable modülünde, bazı ölçütlerle eşleşen tek bir öğeyi arayarak, ana işlevinizin çalışmasını toplu olarak yapan bir find işlevi vardır. Onun gerçek tip daha genel olmakla dizilere kısıtlı zaman bu gibi:

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

Sonra sadece yazabilirsiniz:

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

Tamam, anlıyorum. Dolayısıyla, notasyon bir dizi döndürmek zorundadır ve tüm ifadeler bu diziler üzerinde filtreleme ve haritalama yapmayı amaçlamaktadır. – Albtzrly

+0

Evet, doğru. Eğer bir 'Belki' geri dönmek isterseniz, o zaman 'do' bloğunun 'Belki' ile ilgili olması gerekir. Cevabımı biraz güncelledim. –

+0

Bunu açıkladığınız için teşekkür ederiz. "Belki bağlamında" ve "çoklu olası değerlerin bağlamında" olmanın bu notu mantıklıdır. Daha önce böyle düşünmemiştim. – Albtzrly

0

Tamam, işe yarayan bir şey buldum, ancak ideal olup olmadığından emin değilim. do-notasyonu tipi Array (Belki Yolu) değerini döndürür gibi

findIn :: String -> Path -> Maybe Path 
findIn search start = if (length r == 1) 
         then head r 
         else Nothing 
    where 
    r = do 
     file <- ls start 
     guard $ (filename file) == search 
     [file] 

Yani görünüyor.

İlgili konular