所以我有一个数据列表,我知道newtype当前更好,但是我会添加更多内容。我想将Pack列表转换为String。
unpack [Pack ('a','b'), Pack ('c','d') , Pack (' ', 'e') ] = "abcd e"
我当时正在考虑使用折叠架,但一直想弄清楚它。
data Pack= Pack (Char, Char) deriving ( Show)
unPack:: [Pack] -> String
unpack list = foldr (\Pack (a,b) -> show a + show b -> concat) "" list
感谢您
答案 0 :(得分:4)
要在lambda中对Pack xyz
进行图案补丁,您需要将其放在括号中:
foldr (\(Pack (a,b)) -> ...)
您写的内容实际上将解析为两个单独的参数
foldr (\(Pack) -> \(a,b) -> ...)
接下来,您不能将字符串与+
连接在一起,即用于数字。 ++
或<>
用于列表/字符串。
然后,-> concat
无效的语法。您要做的是将其余的文件夹计算连接到所示的a
和b
。剩下的就是折叠功能的第二个参数:
foldr (\(Pack (a,b)) rest -> show a ++ show b ++ rest)
...或更短
foldr (\(Pack (a,b)) -> shows a . shows b)
答案 1 :(得分:4)
您的Pack
类型与两个字符的字符串同构:
pack2String :: Pack -> String
pack2String (Pack (a,b)) = a:[b]
string2Pack :: String -> Pack -- partial, since String isn't limited in length
string2Pack (a:[b]) = Pack (a, b)
(请注意,Pack (a,b)
已经增加了不必要的包装; data Pack = Pack Char Char
也与Pack (Char, Char)
同构。)
因此,您实际上不需要foldr
;您可以改为使用列表monad。
unpack :: [Pack] -> String
unpack xs = xs >>= pack2String
如果您对单子还不太满意,可以直接使用concatMap
函数:
unpack :: [Pack] -> String
unpack = concatMap pack2String