本地数据类型定义

6 syntax haskell state-machine algebraic-data-types

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

\n\n
zigzag :: Int -> Int -> [Int]\nzigzag low upp = fsa Incr low\n\n   where\n      data State = Incr | Decr\n\n      fsa :: State -> Int -> [Int]\n      fsa state n\n         = n : case state of\n                  Incr | n < upp   -> fsa Incr (n + 1)\n                       | otherwise -> fsa Decr (n - 1)\n\n                  Decr | n > low   -> fsa Decr (n - 1)\n                       | otherwise -> fsa Incr (n + 1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我不能:

\n\n
error: parse error on input \xe2\x80\x98data\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有比将State定义与分开更好的方法zigzag

\n\n
\n\n

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

\n

k_g*_*k_g 5

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

或者,如果您不想导出类型,则可以将函数和数据类型放入其自己的模块中data

提议包含此功能,但由于某种原因它不是优先事项。我想人们通常将类型视为顶级函数之间的高级协议,而不是通常where级别函数之间的协议。

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