Haskell列表理解0和1

Sha*_*abu 5 haskell list

我正在尝试编写一个函数

row :: Int -> Int -> [Int]
row n v
Run Code Online (Sandbox Code Playgroud)

返回一个n整数列表,所有的整数,0除了v第th个元素,需要是一个1.

例如,

row 0 0 = []
row 5 1 = [1,0,0,0,0]
row 5 3 = [0,0,1,0,0]
Run Code Online (Sandbox Code Playgroud)

我是Haskell的新手,对此有很多困难.特别是我无法弄清楚如何重复它0.我理解构建列表的概念[1..n],但我得到了[1,2,3,4,5]

任何有关这方面的帮助将不胜感激.谢谢.

jeh*_*eha 16

尝试:

let row n v = map (\x -> if x == v then 1 else 0) [1..n]
Run Code Online (Sandbox Code Playgroud)

  • 更短:`row nv = map(fromEnum.(== v))[1..n]` (4认同)
  • 克朗克三角洲的+1 - 一个值得注意的片段 (3认同)
  • @Landei:更短,但有点模糊了意思. (2认同)

Lan*_*dei 11

这是一个"monadic"解决方案:

row n v = [(v-1, 0), (1, 1), (n-v, 0)] >>= (uncurry replicate)
Run Code Online (Sandbox Code Playgroud)

replicate函数多次重复给定值,例如replicate (v-1) 0给出一个v-1零列表.将uncurry被用于修改replicate以接受一个元组,而不是两个单独的参数.有趣的操作员>>=是monad的核心; 对于列表,它concatMap与翻转的参数相同.


mb1*_*b14 8

有一个全面的清单:

 row n v = [if x == v then 1 else 0 | x <- [1..n]]
Run Code Online (Sandbox Code Playgroud)

或使用fromEnum(谢谢dave4420)

 row n v = [fromEnum (x == v) | x <- [1..n]]
Run Code Online (Sandbox Code Playgroud)


kee*_*ing 0

具有两个临时变量 c 和 lst 的简单递归循环。c 用于计数,lst 是我们必须返回的列表。

row :: Int -> Int -> [ Int ]
row 0 0 = []
row n v = rowHelp n v 1 [] where
    rowHelp n v c lst
            | c > n = lst
            | v == c = rowHelp n v ( c + 1 ) ( lst ++ [ 1 ] )
            | otherwise = rowHelp n v ( c + 1 ) ( lst ++ [ 0 ] )
Run Code Online (Sandbox Code Playgroud)

~~