我的语法错误的来源

时间:2014-08-25 07:26:19

标签: haskell

我正在学习Haskell,并且正在编写一本书中的示例程序。下面的这个模块将无法编译,并在ghci和ghc中给出了以下错误:

“Optimal.hs:15:23:解析错误输入'='”

任何想法,我都看不到它?


module Optimal (optimalPath) where

import RoadSystem

optimalPath :: RoadSystem -> Path
optimalPath roadSystem =
    let (bestAPath, bestBPath) = foldl roadStep ([], []) roadSystem
    in if sum (map snd bestAPath) <= sum (map snd bestBPath)
            then reverse bestAPath
            else reverse bestBPath

roadStep :: (Path, Path) -> Section -> (Path, Path)
roadStep (pathA, pathB) (Section a b c) =
    let timeA = sum (map snd pathA)
        timeB = sum (map snd pathB)
        forwardTimeToA = timeA + a
        crossTimeToA = timeB + b + c
        forwardTimeToB = timeB + b
        crossTimeToB = timeA + a + c
        newPathToA = if forwardTimeToA <= crossTimeToA
                        then (A, a):pathA
                        else (C, c):(B, b):pathB
        newPathToB = if forwardTimeToB <= crossTimeToB
                        then (B, b):pathB
                        else (C, c):(A, a):pathA
    in (newPathToA, newPathToB)

1 个答案:

答案 0 :(得分:7)

  

任何想法,我都看不到它?

是使用制表符进行缩进时发生的情况。 Haskell standard要求假设一个 8 字符的tabstop,因此编译器实际上认为您的代码是:

module Optimal (optimalPath) where

import RoadSystem

optimalPath :: RoadSystem -> Path
optimalPath roadSystem =
        let (bestAPath, bestBPath) = foldl roadStep ([], []) roadSystem
        in if sum (map snd bestAPath) <= sum (map snd bestBPath)
                then reverse bestAPath
                else reverse bestBPath

roadStep :: (Path, Path) -> Section -> (Path, Path)
roadStep (pathA, pathB) (Section a b c) =
        let timeA = sum (map snd pathA)
                timeB = sum (map snd pathB)
                forwardTimeToA = timeA + a
                crossTimeToA = timeB + b + c
                forwardTimeToB = timeB + b
                crossTimeToB = timeA + a + c
                newPathToA = if forwardTimeToA <= crossTimeToA
                                                then (A, a):pathA
                                                else (C, c):(B, b):pathB
                newPathToB = if forwardTimeToB <= crossTimeToB
                                                then (B, b):pathB
                                                else (C, c):(A, a):pathA
        in (newPathToA, newPathToB)

确实在第15行附近,第23个角色:

        let timeA = sum (map snd pathA)
                timeB = sum (map snd pathB)

这是语法错误。

修复它:

  • 不要使用标签进行缩进。 每个编辑器都允许您配置标签键以插入可配置数量的空格而不是一个标签,因此&& #39; s no&#34;我必须多次按空格键&#34;问题。
  • 在编辑器中使用8的tabstop。请注意,如果您将代码发送给其他人,则在修改代码时可能会遇到同样的问题。
相关问题