这可能非常简单,但我无法想象如何实现 Python 中的 equivalent。
[0]*n
在Haskell中,要获取一个包含n个零的列表。
[0]*n
不起作用。我是否必须做类似以下的事情:
[0 | x <-[1..5]]
?这可能非常简单,但我无法想象如何实现 Python 中的 equivalent。
[0]*n
[0]*n
[0 | x <-[1..5]]
?λ> take 5 (repeat 0)
[0,0,0,0,0]
正如@obadz所指出的那样,这甚至更加简洁:
λ> replicate 5 0
[0,0,0,0,0]
个人而言不太喜欢Python的语法。 *
这个符号原本代表乘法,但在你的情况下它会做其他的事情。不过这只是我的意见 :)
*
对于列表和整数的作用相同;它是重复加法。 some_list * 3 == 3 * some_list == some_list + some_list + some_list
,其中列表加法只是连接。 - chepnernumpy.array([0]) * 3
。 - leftaroundaboutimport Data.Monoid
zeroes = 5 * [0] where (*) = mtimes
你可以自己定义它(作为一个玩具示例)
(*) :: [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]
显然,这只是一个玩具示例,您可能想为此定义另一个运算符或仅仅是一个函数。