在Haskell中实现有限状态自动机,我想这样做:

zigzag :: Int -> Int -> [Int]
zigzag low upp = fsa Incr low

   where
      data State = Incr | Decr

      fsa :: State -> Int -> [Int]
      fsa state n
         = n : case state of
                  Incr | n < upp   -> fsa Incr (n + 1)
                       | otherwise -> fsa Decr (n - 1)

                  Decr | n > low   -> fsa Decr (n - 1)
                       | otherwise -> fsa Incr (n + 1)


但是我不能:

error: parse error on input ‘data’


是否有比将State定义与zigzag分开更好的方法?



如果我可以使用显式枚举或数据类型,则我不希望根据布尔值或数字隐式地编码状态标识符。局部函数定义旨在实现模块化,以保护描述性名称空间的完整性,避免单一关系/使用混乱。我不明白为什么在这方面的数据定义应该区别对待。

最佳答案

您不能在本地放置data定义,而只能在顶层放置。但是,您可以使用Boolif而不是自定义数据类型和case

另外,如果您不想导出data类型,可以将函数和数据类型放在自己的模块中。

包括此功能has been proposed,但是出于某种原因它不是优先事项。我猜人们通常将类型视为顶级函数之间的高级协议,而不是通常在where级函数之间的类型。

10-06 06:02