我正在阅读本教程http://learnyouahaskell.com/a-fistful-of-monads并偶然发现了这个定义:
type KnightPos = (Int,Int)
moveKnight :: KnightPos -> [KnightPos]
moveKnight (c,r) = do
(c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
guard (c' `elem` [1..8] && r' `elem` [1..8])
return (c',r')
in3 :: KnightPos -> [KnightPos]
in3 start = do
first <- moveKnight start
second <- moveKnight first
moveKnight second
Run Code Online (Sandbox Code Playgroud)
我有一个关于函数的问题in3(它在棋盘上获取一对坐标(Int,Int)并产生一个字段列表[(Int,Int)],可以从骑士的3个移动中从该字段到达).
是否有可能(如果是这样 - 如何做)将该函数重新制作inNMoves :: (Num a) => KnightPos -> a -> [KnightPos]
成为一个参数,而不是被绑定到3个跳跃?
我正在尝试编写一个函数
group::[(Int, Int)]->[[(Int, Int)]]
Run Code Online (Sandbox Code Playgroud)
这会将元组列表的元素分组为依赖于第一个坐标的子组,即:
group [(1,1),(1,2),(2,1),(2,2),(2,3)]
Run Code Online (Sandbox Code Playgroud)
应该导致
[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]
Run Code Online (Sandbox Code Playgroud)
我认为列表理解是方式,但我有点卡住..有人可以提供建议/解决方案吗?
PS函数也可以将第一个坐标可以取的最大值作为参数,如果有任何帮助的话
我使用以下功能:
combinations :: Int -> [a] -> [[a]]
combinations k xs = combinations' (length xs) k xs
where combinations' n k' l@(y:ys)
| k' == 0 = [[]]
| k' >= n = [l]
| null l = []
| otherwise = Prelude.map (y :) (combinations' (n - 1) (k' - 1) ys) ++ combinations' (n - 1) k' ys
Run Code Online (Sandbox Code Playgroud)
它适用于我可以提出的任何示例,但是当我从我的大项目中的其他函数调用它时,在某些情况下我得到一个例外:
Exception: projekt.hs:(34,9)-(38,108): Non-exhaustive patterns in function combinations'
Run Code Online (Sandbox Code Playgroud)
上面的定义有问题吗?是否遗漏了一些案例?我认为otherwise处理任何不属于以前情况的东西.
我正在尝试编写一个函数
fill::Int->Int->[(Int, Int, Int)]->[(Int, Int, Int)]
fill width height board = ...
Run Code Online (Sandbox Code Playgroud)
"填充"给定的板(在板上的单个(Int,Int,Int)三元组中,前两个Ints是坐标,第三个是该区域的值),其中缺少的(第三个坐标设置为0) ),例如:
let x = fill 3 3 [(1,2,2),(1,3,5),(3,2,3)]
Run Code Online (Sandbox Code Playgroud)
应该导致
x = [(1,1,0),(1,2,2),(1,3,5),(2,1,0),(2,2,0),(2,3,0),(3,1,0),(3,2,3),(3,3,0)].
Run Code Online (Sandbox Code Playgroud)
是否有一些可以在这里使用的好函数,或者是一些复杂的双递归?
我想知道如果没有任何语法糖,以下函数会是什么样子:
tails1 :: [a] -> [[a]]
tails1 [] = [[]]
tails1 xs@(x:xs') = xs:tails1 xs'
Run Code Online (Sandbox Code Playgroud)
我最关心的是 @ 运算符的用法,我已经尝试了以下操作,但这显然不是正确的方法
tails1 ((:) x ((:) xs' [])) = xs:tails1 xs'
Run Code Online (Sandbox Code Playgroud)