我想做一个函数,根据传递的字母改变某些值。(这些基本上是给定的方向:东,西......)
代码是:
data Movement = N Int | S Int | E Int | W Int deriving (Eq, Show)
step :: Movement -> (Int, Int) -> (Int, Int)
step (Movement x h) (y, z)
| x == N = (y, z+h)
| x == S = (y, z-h)
| x == W = (y-h, z)
| x == E = (y+h, z)
Run Code Online (Sandbox Code Playgroud)
一个例子:
step (N 1) (239, 578) == (239, 579)
step (S 1) (240, 578) == (240, 577)
step (W 1) (239, 578) == (238, 578)
step (E 1) (239, 577) == (240, 577)
step (N 61) (239, 578) == (239,639)
step (N 2) (-4, 0) == (-4, 2)
step (E 1) (-4, 0) == (-3, 0)
step (S (-61)) (239, 578) == (239,639)
Run Code Online (Sandbox Code Playgroud)
我不断得到
不在范围内:数据构造函数`Movement'
错误信息。
Movement是一种类型,而不是值。你不能在模式中使用它。
此外,N其他构造函数是函数,您不能使用==函数。
您需要改用模式匹配,而忘记了守卫。
step :: Movement -> (Int, Int) -> (Int, Int)
step (N h) (y,z) = ...
step (S h) (y,z) = ...
step (W h) (y,z) = ...
step (E h) (y,z) = ...
Run Code Online (Sandbox Code Playgroud)
或者,重构您的类型:
data Direction = N | S | E | W deriving (Eq, Show)
data Movement = Movement Direction Int deriving (Eq, Show)
step :: Movement -> (Int, Int) -> (Int, Int)
step (Movement x h) (y,z)
| x == N = (y, z+h)
| x == S = (y, z-h)
| x == W = (y-h, z)
| x == E = (y+h, z)
Run Code Online (Sandbox Code Playgroud)
现在你的代码可以工作了,因为Movement它也是一个数据构造函数,并且N和朋友不再是函数。不过,我仍然更愿意避开守卫,并使用
step :: Movement -> (Int, Int) -> (Int, Int)
step (Movement N h) (y,z) = (y, z+h)
step (Movement S h) (y,z) = (y, z-h)
step (Movement W h) (y,z) = (y-h, z)
step (Movement E h) (y,z) = (y+h, z)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |