访问列表条目并显示其值

时间:2015-02-12 17:46:44

标签: haskell

我有一个功能

(.#.) :: [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  

2 个答案:

答案 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,因为我们丢失了空格。

我们可以重现这些空格,但使用intercalateconcat之间有什么区别?老实说,不使用intercalate的最佳解决方案是重现intercalate(其源代码可在Hackage上获得)。

答案 1 :(得分:0)

只需移除(.#.)周围的括号即可。

如果您有一个中缀运算符!#$,其前后有一些内容,例如x !#$ y,您不得使用括号。在其他情况下,添加括号,就像在类型声明中一样。

(这在技术上回答了这个问题,但是Guvante的建议更好。)