所以这看起来应该很简单...但是我不确定将“折叠”贴在哪里(显然您可以用任何一种方式折叠)...
上面写着“使用折叠写一个函数(intToString :: [Int] -> [Char]
)来模仿这张地图:
map intToDigit [5,2,8,3,4] == "52834"
然后说:“要进行转换,请使用intToDigit :: Int -> Char
中的Data.Char
。”
我不确定我是否完全明白这一点...但是似乎并没有那么难-您只是在阅读列表(将其折叠,我就知道折叠的工作方式)一般)从左侧或右侧进行转换...但是我不确定如何设置。
答案 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]