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
實現有所不同?
@ zoran119請注意,沒有理由模式匹配流,所以'show s = show $ take 10 $ streamToList s'會正常工作。這個定義非常容易實現。 – chepner
這是@chepner的絕佳之處,謝謝! – zoran119