添加到其他答案,
由於show
返回java.lang.String
,因此無法顯示無限列表。所以我想我可以寫一個不同版本的節目來代替返回[Char]
。這是我想出來的,它正在工作。
frege> :paste
class AltShow a where
altshow :: a -> [Char]
instance AltShow AltShow a => [a] where
altshow [] = []
altshow xs = concat $ (['['] : intersperse [','] ys) ++ [[']']] where
ys = map altshow xs
instance AltShow Int where
altshow = unpacked <~ show
intersperse :: a -> [a] -> [a]
intersperse _ [] = []
intersperse _ (x:[]) = [x]
intersperse sep (x : y : []) =
x : sep : y : []
intersperse sep (x : y : rest) =
x : sep : y : sep : intersperse sep rest
:q
Interpreting...
frege> altshow [1, 10, 2, 234]
res3 = ['[', '1', ',', '1', '0', ',', '2', ',', '2', '3', '4', ']']
frege> :t res3
res5 :: [Char]
frege> packed res3
res6 = [1,10,2,234]
frege> :t res6
res7 :: String
現在問題的代碼變得類似於Haskell和它不與的OutOfMemoryError爆炸:
frege> :paste
foo = take 10 $ altshow $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)
:q
Interpreting...
frege> foo
res9 = ['[', '1', ',', '2', ',', '3', ',', '4', ',', '5']
frege> packed foo
res11 = [1,2,3,4,5
Frege中的字符串不是列表。所以'take 10'不能應用於'show'的結果。因此,'unpacked'用於首先從'String'轉換爲'[Char]',然後在列表中應用'10'。 – 2012-08-15 01:29:30
那麼什麼是弗雷格的字符串?看起來它們是'java.lang.String'(請參閱Frege語言定義)。你永遠不會考慮評估'unpack',因爲它永遠無法構建字符串! – 2012-08-15 01:41:33