我正在通过CIS194学习一些Haskell。
我有一个数据类型Stream
,可以使用streamFromSeed
函数从种子创建。
data Stream a = Cons a (Stream a)
instance Show a => Show (Stream a) where
show (Cons a s) = show $ take 10 $ streamToList s
streamToList :: Stream a -> [a]
streamToList (Cons a s) = a:(streamToList s)
streamFromSeed :: (a -> a) -> a -> Stream a
streamFromSeed f a = Cons a (streamFromSeed f (f a))
到目前为止一切顺利,所以我在ghci中创建了一个Stream
:
*Main> streamFromSeed (\x -> x+1) 0
[1,2,3,4,5,6,7,8,9,10]
这对我来说有点奇怪 - 我期待[0,1,2,3,4,5,6,7,8,9]
。
所以我将Show
实例更改为:
instance Show a => Show (Stream a) where
show = show . take 10 . streamToList
果然:
*Main> streamFromSeed (\x -> x+1) 0
[0,1,2,3,4,5,6,7,8,9]
这里发生了什么?为什么这两个show
实现不同?
答案 0 :(得分:5)
您的无点版本与此相同:
show s = show $ take 10 $ streamToList s
此处s
指的是整个流,然后您获取它的前10项。这将产生预期的结果。你做的是:
show (Cons a s) = show $ take 10 $ streamToList s
此处a
引用流的第一个元素,s
引用流的其余部分(尾部)。然后你获取该尾部的前10个元素,而不是整个流。