我可以在"中使用"和"其中"在haskell定义中?

时间:2015-10-27 13:38:33

标签: haskell

我正在学习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;像这样?

2 个答案:

答案 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)

作为另一种风格的注释,在物理公式中,我发现使用传统的短变量和常量短标识符更加可读,例如ght