Haskell中n个零的列表

4

这可能非常简单,但我无法想象如何实现 Python 中的 equivalent。

[0]*n

在Haskell中,要获取一个包含n个零的列表。
[0]*n

不起作用。我是否必须做类似以下的事情:[0 | x <-[1..5]]

请查看Haskell标签信息页面,以查找函数和其他有趣的内容:http://stackoverflow.com/tags/haskell/info - jberryman
3个回答

10
你可以这样做:
λ> take 5 (repeat 0)
[0,0,0,0,0]

正如@obadz所指出的那样,这甚至更加简洁:

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

个人而言不太喜欢Python的语法。 * 这个符号原本代表乘法,但在你的情况下它会做其他的事情。不过这只是我的意见 :)


13
复制 5 次数字 0。 - obadz
2
* 对于列表和整数的作用相同;它是重复加法。 some_list * 3 == 3 * some_list == some_list + some_list + some_list,其中列表加法只是连接。 - chepner
1
@n.m 这个评论是回应Sibi关于Python语法的评论。 - chepner
1
@chepner:这确实在某种程度上是一致的。不幸的是,它在使用其他数字运算符时明显不一致。请考虑numpy.array([0]) * 3 - leftaroundabout
我认为我们已经到达了这一点,讨论运算符重载与特定类型运算符(甚至是特定类型函数)的利弊。 - chepner

0
另一种可能性:
import Data.Monoid

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

-1

你可以自己定义它(作为一个玩具示例)

(*) :: [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]

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接