我正在尝试编写一个函数
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)
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与翻转的参数相同.
有一个全面的清单:
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)
具有两个临时变量 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)
~~