折叠成“ map intToDigit” ...

时间:2018-11-14 06:27:44

标签: haskell

所以这看起来应该很简单...但是我不确定将“折叠”贴在哪里(显然您可以用任何一种方式折叠)...

上面写着“使用折叠写一个函数(intToString :: [Int] -> [Char])来模仿这张地图:

map intToDigit [5,2,8,3,4] == "52834"

然后说:“要进行转换,请使用intToDigit :: Int -> Char中的Data.Char。”

我不确定我是否完全明白这一点...但是似乎并没有那么难-您只是在阅读列表(将其折叠,我就知道折叠的工作方式)一般)从左侧或右侧进行转换...但是我不确定如何设置。

1 个答案:

答案 0 :(得分:3)

这并不困难,考虑一下List的定义foldr(或foldl):

 foldr::(a -> b -> b) -> b -> [a] -> b

(a->b->b)step函数,将应用于列表[a]的每个元素,b是您的目标。

现在,您有了一个Int([Int])列表,并且需要转换为[Char](或String)。

通过[a][5,2,8,3,4],通过[]::[Char](您的目标)来获得b,通过(a->b->b)函数来获得step

foldr step ([]::[Char]) [5,2,8,3,4]

我们知道step function的类型为(a->b->b),特别是(Int->[Char]->[Char]),该工作只需将Int转换为[Char],如问题:intToDigit可以帮助将Int转换为Char,并且(:)运算符可以将元素附加在List的开头,因此:

step x s = intToDigit x : s

其中s是[Char](或String),将它们全部放进去:

foldr (\x s->intToDigit x : s) [] [5,2,8,3,4]