【问题标题】:list of n zeros in HaskellHaskell中n个零的列表
【发布时间】:2016-04-03 15:40:46
【问题描述】:

这可能很容易,但我不知道如何做相当于 Python 的

[0]*n

在 Haskell 中,为了得到一个有 n 个零的列表。

[0]*n

不起作用。我是否有义务这样做:[0 | x <-[1..5]]

【问题讨论】:

标签: list haskell list-comprehension


【解决方案1】:

你可以这样做:

λ> take 5 (repeat 0)
[0,0,0,0,0]

或者正如@obadz 指出的那样,这更加简洁:

λ> replicate 5 0
[0,0,0,0,0]

我个人不喜欢 python 语法。 * 表示乘法,但在您的情况下它会做其他事情。但这只是我的意见:)。

【讨论】:

  • replicate 5 0
  • * 适用于列表和整数;这是重复添加。 some_list * 3 == 3 * some_list == some_list + some_list + some_list,其中列表添加只是串联。
  • @n.m 该评论是对 Sibi 关于 Python 语法的评论的回应。
  • @chepner:这本身确实有点一致。不幸的是,它与数字运算符的其他用法明显不一致。考虑numpy.array([0]) * 3
  • 我认为我们已经到了讨论运算符重载与类型特定运算符(甚至类型特定函数)扩散的利弊的地步。
【解决方案2】:

另一种可能性:

import Data.Monoid

zeroes = 5 * [0] where (*) = mtimes

【讨论】:

    【解决方案3】:

    您可以自己定义(作为玩具示例)

    (*) :: [a] -> Int -> [a]                     
    (*) xs n = take n $ cycle xs
    

    这样你就可以拥有

    Prelude> [0]*5                                                      
    [0,0,0,0,0]
    
    Prelude> [0,1]*5
    [0,1,0,1,0]
    

    显然,通过重新定义现有的运算符有“副作用”

    Prelude> 4*4
    
    <interactive>:169:1:
        Non type-variable argument in the constraint: Num [a]
        (Use FlexibleContexts to permit this)
        When checking that `it' has the inferred type
          it :: forall a. Num [a] => [a]
    

    或者python 的解释是复制列表 n 次(而不是从循环的列表元素中选择 n 个元素)。在这种情况下,您可以将其定义为

    (*) :: [a] -> Int -> [a]                                                                                 
    (*) xs n = concat $ replicate n xs                                                                       
    
    
    Prelude> [0]*4                                                                                                        
    [0,0,0,0]
    
    Prelude> [0,1]*4                                                                                                      
    [0,1,0,1,0,1,0,1]
    

    显然,这是一个玩具示例,您可能想为此定义另一个运算符或简单的函数。

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2012-08-30
      • 2012-10-04
      • 2015-01-27
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多