haskell 如何为一个带有foldr的List创建一个show示例?

vwkv1x7d  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(113)

我想为我的数据类型“My list”编写我自己的show示例。到目前为止,我的方法是有效的,但我总是在结尾处使用逗号。我已经尝试过从最后一个元素开始Fold并将其从列表中删除,但这非常麻烦,而且没有成功。有没有更简单的方法来获得正确的解决方案?
实际值{1,2,3,} -〉预期值{1,2,3}

instance Show a => Show (Mylist1 a) where
  show (Mylist1 []) = "{}"
  show (Mylist1 xs) = "{" ++ foldr (\x y -> show x ++ "," ++ y) "}" xs
n8ghc7c1

n8ghc7c11#

既然你已经把空列表的情况分开了,为什么不利用非空列表的第一个元素呢?

instance Show a => Show (Mylist1 a) where
  show (Mylist1 []) = "{}"
  show (Mylist1 (x:xs)) = "{" ++ show x ++ foldr (\x y -> "," ++ show x ++ y) "}" xs
yuvru6vn

yuvru6vn2#

intercalate

import Data.List
instance Show a => Show (Mylist1 a) where
  show (Mylist1 xs) = '{' : intercalate ", " (map show xs) ++ "}"
i34xakig

i34xakig3#

如果你真的想使用纯foldr,而不想在show参数上进行任何模式匹配,那么你可以通过累加延续并对其应用参数来实现这个技巧,这样构建的计算就可以知道它当前正在处理的元素索引。

show (Mylist l) =
  foldr
    (\el cont n acc -> ((if n == 0 then "{" else ",") ++ show el) ++ cont (n + 1) acc)
    (\n x -> if n == 0 then "{}" else x)
    l
    0 "}"

但这是一个矫枉过正,不要使用它,除非你出于某种原因必须在一个单一的foldr表达整个事情。

相关问题