【问题标题】:Accessing a list entry and showing its values访问列表条目并显示其值
【发布时间】:2015-04-13 14:11:57
【问题描述】:

我有一个函数

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

【问题讨论】:

  • 1.你是如何使用show并得到错误的? 2. 举一个你想要的showIntegers [1,2,3]字符串的例子
  • 添加到问题中
  • 什么错误? *** Exception: Prelude.(!!): index too large 有机会吗?列表是零索引的,所以你可能想要[0..length r - 1]
  • @MichalSeweryn:这会将列表转换为字符串,然后获取结果字符串的索引。也可以使用`来表示一个代码段。
  • 在 Haskell 中使用 r !! i 访问列表的元素是最后的手段,因为它效率很低(列表不是数组)。在[1 .. length r] 上使用列表推导是一种常见的反模式。不要写[f (r !! i) | i &lt;-[0..length r-1]],改用[f x | x&lt;-r]map f r

标签: haskell


【解决方案1】:

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

如果你有一个中缀运算符 !#$ ,在它之前和之后都有一些东西,例如x !#$ y,你不能使用括号。在其他情况下,添加括号,就像在类型声明中一样。

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

【讨论】:

    【解决方案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 &lt;- 0 .. length r - 1]map show r 相同(后者是标准的)。

    现在你有:concat $ "List: " : (map show r) 创建 List: 123 因为我们丢失了空格。

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

    【讨论】:

    • 没有预定义的功能是否可行?我试图了解 Haskell 是如何工作的,如果我只是使用它,它不会帮助我理解事情是如何工作的。
    • 非常感谢 Guvante,你是救命稻草!
    • 另外,我的教授坚持我使用 1 索引。我不知道为什么,我习惯了 0 索引,但我必须遵守。
    • 我认为值得指出的是unwordsintercalate " "的特例,unwords已经存在于Prelude中,你不需要导入Data.List
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多