本地数据类型定义
Local data type definitions
在 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
分开更好的方法?
如果我可以使用显式枚举或数据类型,我不想根据布尔值或数字对状态标识符进行隐式编码。本地函数定义旨在启用模块化,以保护描述性命名空间的完整性免受 single-relation/use 混乱的影响。我不明白为什么应该区别对待这方面的数据定义。
您不能在本地放置 data
定义,只能在顶层放置。但是,您可以使用 Bool
和 if
而不是自定义数据类型和 case
.
或者,如果您不想导出 data
类型,您可以将函数和数据类型放在它们自己的模块中。
它 has been proposed 包含此功能,但由于某些原因它不是优先事项。我想通常人们将类型视为顶级函数之间的高级协议,而不是 where
级函数之间的高级协议。
在 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
分开更好的方法?
如果我可以使用显式枚举或数据类型,我不想根据布尔值或数字对状态标识符进行隐式编码。本地函数定义旨在启用模块化,以保护描述性命名空间的完整性免受 single-relation/use 混乱的影响。我不明白为什么应该区别对待这方面的数据定义。
您不能在本地放置 data
定义,只能在顶层放置。但是,您可以使用 Bool
和 if
而不是自定义数据类型和 case
.
或者,如果您不想导出 data
类型,您可以将函数和数据类型放在它们自己的模块中。
它 has been proposed 包含此功能,但由于某些原因它不是优先事项。我想通常人们将类型视为顶级函数之间的高级协议,而不是 where
级函数之间的高级协议。