2016-04-02 12 views
1

Nerede yanlış olduğumu söyleyebilir misiniz, lütfen? Monadlarda başlıyorum ve gerçekten hataları anlamıyorum.forM'un kendi uygulaması, Bir hata bulamıyorum

m.hs:110:36: 
     Couldn't match type ‘m’ with ‘(->) (a -> [b0])’ 
      ‘m’ is a rigid type variable bound by 
       the type signature for 
       myforM :: Monad m => [a] -> (a -> m b) -> m [b] 
       at monady1.hs:108:11 
     Expected type: m [b] 
      Actual type: (a -> [b0]) -> [[b0]] 
     Relevant bindings include 
      f :: a -> m b (bound at monady1.hs:110:15) 
      xs :: [a] (bound at monady1.hs:110:11) 
      x :: a (bound at monady1.hs:110:9) 
      myforM :: [a] -> (a -> m b) -> m [b] (bound at monady1.hs:109:1) 
     Possible cause: ‘myforM’ is applied to too many arguments 
     In the first argument of ‘(>>=)’, namely ‘myforM xs’ 
     In the expression: myforM xs >>= (\ rs -> return (r : rs)) 

Ve ikinci hata:: has

m.hs:110:36: 
      Couldn't match type ‘b’ with ‘[b0]’ 
       ‘b’ is a rigid type variable bound by 
        the type signature for 
        myforM :: Monad m => [a] -> (a -> m b) -> m [b] 
        at monady1.hs:108:11 
      Expected type: m [b] 
       Actual type: (a -> [b0]) -> [[b0]] 
      Relevant bindings include 
       r :: b (bound at monady1.hs:110:31) 
       f :: a -> m b (bound at monady1.hs:110:15) 
       myforM :: [a] -> (a -> m b) -> m [b] (bound at monady1.hs:109:1) 
      Possible cause: ‘myforM’ is applied to too many arguments 
      In the first argument of ‘(>>=)’, namely ‘myforM xs’ 
      In the expression: myforM xs >>= (\ rs -> return (r : rs)) 
     Failed, modules loaded: none. 

cevap

4
myforM xs >>= ... 

(a -> m b) -> m [b] yazın Bu

myforM :: (Monad m) => [a] -> (a -> m b) -> m [b] 
myforM [] _ = return [] 
myforM (x:xs) f = (f x) >>= (\r -> myforM xs >>= (\rs -> return (r:rs))) 

İlk hatayı çalışıyor görünüyor. Burada f eksik. Hata biraz yanıltıcıdır: sorunu içeriyor, ancak doğru nedeni değil:

Expected type: m [b] 
Actual type: (a -> [b0]) -> [[b0]] 
... 
Possible cause: ‘myforM’ is applied to too many arguments 
İlgili konular