我正在学习haskell的过程中,所以我尝试制作以下函数,看看能不能做到。
这就是我写的
projectileY :: (Num a, Fractional a) => a -> a -> a -> a -> a
projectileY gravity time vInit height = let equation gr ti veli hei = -0.5*g*(t^2)+vi*t+h
in if (equation g t vi h < 0) then 0 else (equation g t vi h)
where
g = gravity
t = time
vi = vInit
h = height
main :: IO()
main = do
print (projectileY 9.8 0.1 2.0 100)
这是错误
parse error (possibly incorrect indentation or mismatched brackets)
所以我尝试了一段时间的压痕,没有成功。我可以在&#34;中使用&#34;和&#34;其中&#34;像这样?
答案 0 :(得分:5)
如果您更改了类型签名并进行了一些清理(正确的缩进,而不是混合标签和空格),它应该可以正常工作。这是一个有效的代码:
projectileY :: (Fractional a, Ord a) => a -> a -> a -> a -> a
projectileY gravity time vInit height = let equation gr ti veli hei = -0.5*g*(t^2)+vi*t+h
in if (equation g t vi h < 0)
then 0
else (equation g t vi h)
where
g = gravity
t = time
vi = vInit
h = height
main :: IO()
main = print (projectileY 9.8 0.1 2.0 100)
我是否可以像这样使用“in”和“where”?
是。但请注意,in
应与let
一起使用。 let in语法应该形成一个表达式。
答案 1 :(得分:0)
除了其他人写的关于缩进的内容之外,定义一个局部函数然后两次用同一组参数应用它几乎没有意义。总的来说,你把它变得太复杂而没有收获。
为什么不写简单?:
projectileY g t v0 h0 = max 0.0 (-0.5 * g * (t ^ 2) + v0 * t + h0)
作为另一种风格的注释,在物理公式中,我发现使用传统的短变量和常量短标识符更加可读,例如g
,h
和t
。