字符串数据列表

时间:2018-11-13 16:37:24

标签: haskell functional-programming

所以我有一个数据列表,我知道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

感谢您

2 个答案:

答案 0 :(得分:4)

要在lambda中对Pack xyz进行图案补丁,您需要将其放在括号中:

            foldr (\(Pack (a,b)) -> ...)

您写的内容实际上将解析为两个单独的参数

            foldr (\(Pack) -> \(a,b) -> ...)

接下来,您不能将字符串与+连接在一起,即用于数字。 ++<>用于列表/字符串。

然后,-> concat无效的语法。您要做的是将其余的文件夹计算连接到所示的ab。剩下的就是折叠功能的第二个参数:

            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