【问题标题】:Beginner trouble with Haskell syntaxHaskell 语法的初学者问题
【发布时间】:2015-05-23 08:05:36
【问题描述】:

所以到目前为止,我只将 Haskell 用于简单的教程,下面的代码给了我一个“解析错误”...我知道这与我的语法有关,但我不知道是什么

 --ternarySearch
  7 ternarySearch :: (Float -> Float) -> Float -> Float -> Float -> Float
  8 ternarySearch f a b tau = do 
  9                         if (abs(b-a) < tau)
 10                           then return ((a+b)/2)
 11                         c = (a + (b-a)/3)
 12                         d = (b - (b-a)/3)
 13                         if f(c) < f(d)
 14                           then return (ternarySearch f c b tau)
 15                         else return (ternarySearch f a d tau)

我得到的错误是:

ternary.hs:11:25: parse error on input `c'

有什么想法吗?

【问题讨论】:

  • 你做错了很多事情:不使用 Monad 的 do-notation、缩进、if/else 是错误的。我建议您在尝试其中的程序之前使用任何教程/书籍来学习 Haskell。
  • 是的,不幸的是,这是我第一次涉足该语言。对于初学者:缩进应该是什么样的?这无疑是给我带来麻烦的主要问题之一。
  • nvm 我想我有缩进,但我的主要问题仍然是一样的:是什么导致了解析错误?
  • 缺少else。在大多数其他语言中,else 是可选的。在 Haskell 中,if 比其他语言中的 if 更类似于 ?:if x then y 就像在 C 中编写 x ? y,并且出于相同的原因会给您一个错误:它是一个表达式,并且当条件为假时,它不能不评估。

标签: haskell syntax parse-error


【解决方案1】:

你做错了很多事:

  • 除非上下文是 Monad,否则不应使用 do-notation。
  • return 的滥用:我认为您将命令式语言 return 与 Haskell 的语言混淆了。
  • if/else 用法:注意在 Haskell 中 if-else 是一个表达式。因此,与某些其他语言相比,if 和 else 都是强制性的。
  • 缩进似乎是错误的:参见rules here.

您尝试使用守卫的更好版本:

ternarySearch :: (Float -> Float) -> Float -> Float -> Float -> Float
ternarySearch f a b tau 
    | abs (b-a) < tau = (a+b) / 2
    | f c < f d = ternarySearch f c b tau
    | otherwise = ternarySearch f a d tau
    where
      c = a + (b-a)/3
      d = b - (b-a)/3

话虽如此,我建议您阅读一些book 以获得更好的理解。

【讨论】:

  • 好的,感谢您的帮助(和耐心)。我实际上已经开始在最后进行“哪里”的改变,你肯定是对的,我正在考虑必要的“返回”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多