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

时间:2019-10-20 12:33:28

标签: haskell dfa

我的任务是在haskell中定义(最小)DFA。它采用以下形式([状态],“语言”,过渡函数,开始状态,[接受状态]),并应采用一个整数,并为可被该数字整除的二进制数字为其创建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的新手,因此不确定如何解决这个问题。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

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

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

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