Hmmm, seems like your (-+) is not lazy enough.

Since pattern matching is strict by default, you have

anything -+ (_|_) = (_|_)

Therefore, the function, which is constantly (_|_), is a fixed point for the equation defining h. In other words, if you define

h' x = undefined

then you have

h' x = (-+) anything (h anything)

in particular,

h' x = (-+) (first x) (h (rest x))

You can fix it by defining (-+) as

x -+ ~(List y) = ...

data List a = List(Integer->a)

instance Show a => Show (List a) where
 show (List f) = "[" ++ show (f(0)) ++
   concat ["," ++ show (f(toInteger i))| i<-[1..]] ++ "]"

list :: Integer -> List Integer
list x = List(\z -> x+z)

(-+) :: a -> List a -> List a
x -+ (List y) = List(f) where
 f 0 = x
 f k = y(k-1)

first :: List a -> a
first (List f) = f 0

rest :: List a -> List a
rest (List y) = List(f) where
 f k = y(k+1)

h :: List a -> List a
h x = (-+) (first x) (h (rest x))
--------
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to