点自由函数给非点自由提供不同的结果?

时间:2016-03-04 12:52:19

标签: haskell

我正在通过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实现不同?

1 个答案:

答案 0 :(得分:5)

您的无点版本与此相同:

show s = show $ take 10 $ streamToList s

此处s指的是整个流,然后您获取它的前10项。这将产生预期的结果。你做的是:

show (Cons a s) = show $ take 10 $ streamToList s

此处a引用流的第一个元素,s引用流的其余部分(尾部)。然后你获取该尾部的前10个元素,而不是整个流。

相关问题