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