2016-03-04 50 views
1

我正在通過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實現有所不同?

回答

5

你自由點的版本是相同的:

show s = show $ take 10 $ streamToList s 

這裏s指整個流,然後你把第10條的吧。這會產生預期的結果。你所做的是:

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

這裏a指流和s到流(尾部)的其餘部分的第一要素。然後,您採取該尾巴的前10個元素,而不是整個流。

+2

@ zoran119請注意,沒有理由模式匹配流,所以'show s = show $ take 10 $ streamToList s'會正常工作。這個定義非常容易實現。 – chepner

+0

這是@chepner的絕佳之處,謝謝! – zoran119