如何遍历列表以在 haskell 中的转换函数中获取值?

How to iterate through a list to grab values in an transition function in haskell?

我的任务是在 haskell 中定义一个(最小的)DFA。它的形式是 ([states], "language", transition function, start state, [accept states]),并且应该接受一个整数,并为它创建一个 DFA,用于可被整除的二进制数那个数字。例如,函数 4 将为可被 4 整除的二进制数创建 DFA。

我开始为 1 到 6 创建 DFA 以查看它正在采用的模式,我发现如果它处于某个状态并接收到 0,则二进制数加倍,所以这意味着状态加倍,如果它收到1,状态加倍并加1.

这是我为所有可被 4 整除的数字制作的示例。

create 4
  = ([0,1,2,3], "01", ts, 0, [0])
    where
      ts = [ ((0, '0'), 0)
           , ((0, '1'), 1)
           , ((1, '0'), 2)
           , ((1, '1'), 3)
           , ((2, '0'), 0)
           , ((2, '1'), 1)
           , ((3, '0'), 2)
           , ((3, '1'), 3)
           ] 

这是我的广义 DFA 创建器的开始,它接受整数 n。

create n
  = ([0..(n-1)], "01", ts, 0, [0])
    where
      ts = [ ((x, '0'), x `mod` n)
           , ((x, '1'), (x*2 + 1) `mod` n)
           ] 
        #where x is an iterated number through the states array

我不确定这是最好的还是正确的方法..

我基本上希望它遍历状态数组,并为每个状态创建 2 个转换函数,一个用于接收“0”,一个用于接收“1”,然后应用上述逻辑。

我是 haskell 的新手,所以不太确定如何处理这个问题。任何建议将不胜感激!

提示:列表理解是一种循环。所以,你可以写

ts =
    [ {- this part is your job -}
    | x <- [0..n-1]
    , char <- ['0', '1']
    ]

这将是一种嵌套循环,遍历 0n-1 范围内的所有数字,以及所有二进制数字。在 {- this part is your job -} 处,您可以分别使用名称 xchar 作为两个循环的当前值。