我有一个功能
(.#.) :: [a] -> Integer -> a -- 1-indexing with 'Integer'
xs .#. j = xs !! (fromIntegral $ j-1)
showIntegers :: [Integer] -> String
showIntegers r = let
str = concat $ "List: " : [r (.#.) j | j <- [1..length r]]
如何将r (.#.) j
显示为Char
/ String
而不是整数?我尝试使用show
,但它给了我一个错误。
以下是我使用show
:
str = concat $ "List: " : [show $ r (.#.) j | j <- [1..length r]]
输入和输出示例:
> showIntegers [1,2,3]
List: 1 2 3
答案 0 :(得分:2)
您应该使用Data.List.intercalate或者更好地使用unwords。
import Data.List
showIntegers :: [Integer] -> String
showIntegers r = "List: " ++ intercalate " " $ map show r
--showIntegers r = "List: " ++ unwords $ map show r
编辑:在任何一种情况下,您都应该避免使用!!
来枚举原始列表。
首先我要摆脱.#.
它只是会让你混淆使用不同的编号系统,最好是撕掉那个绑带。
接下来意识到[show $ r !! j <- 0 .. length r - 1]
与map show r
相同(后者是标准的)。
现在你要:concat $ "List: " : (map show r)
创建List: 123
,因为我们丢失了空格。
我们可以重现这些空格,但使用intercalate
和concat
之间有什么区别?老实说,不使用intercalate
的最佳解决方案是重现intercalate
(其源代码可在Hackage上获得)。
答案 1 :(得分:0)
只需移除(.#.)
周围的括号即可。
如果您有一个中缀运算符!#$
,其前后有一些内容,例如x !#$ y
,您不得使用括号。在其他情况下,添加括号,就像在类型声明中一样。
(这在技术上回答了这个问题,但是Guvante的建议更好。)