Napisałem następującą (trywialną) funkcję:

h c = [f x | x <- a, f <- b, (a, b) <- c]

Spodziewałem się, że zostanie to odcukrzone jako:

h c = do (a, b) <- c
         f <- b
         x <- a
         return (f x)

Z kolei odcukrzono (ignorując rzeczy fail) jako:

h c = c >>= \(a, b) -> b >>= \f -> a >>= \x -> return (f x)

Jednak GHCi zwraca błąd:

<interactive>:24:17: error: Variable not in scope: a :: [a1]
<interactive>:20:27: error:
    Variable not in scope: b :: [t0 -> b1]

Wydaje się to bezsensowne, ponieważ a i b są rzeczywiście w zakresie.

3
schuelermine 18 listopad 2018, 22:28

1 odpowiedź

Najlepsza odpowiedź

Twoje wiązania są w złej kolejności.

h c = [f x | (a,b) <- c, f <- b, x <- a]
12
Jorge Adriano 18 listopad 2018, 22:31