1

我正在为一个类处理一个 Haskell 问题,但我似乎无法获得正确的语法来将项目从自定义类型中拉出。这是类型:

-- Finite State Machine M = (Q, q0, F, d)

type FSM = ([Int], Int, [Int], [(Int,Char,Int)])

这是我一直在使用的测试值:

testFSM :: FSM

testFSM = ( [ 1, 2, 3 ], 1, [ 3 ], [ ( 1, 'a', 2 ), ( 2, 'b', 3 ), ( 1, 'b', 1 ) ] )

我希望能够从 FSM 类型中提取每条数据,但我不太确定我将如何做到这一点。我试过这个:

fsmGetQ fsm = [ q | ( q, q0, f, d ) <- fsm ]

但是如果我使用 testFSM 运行该功能,我会得到:

<interactive>:102:9:
    Couldn't match type `([Int], Int, [Int], [(Int, Char, Int)])'
                  with `[(t0, t10, t20, t30)]'
    Expected type: [(t0, t10, t20, t30)]
      Actual type: FSM
    In the first argument of `fsmGetQ', namely `testFSM'
    In the expression: fsmGetQ testFSM
    In an equation for `it': it = fsmGetQ testFSM

我有很多用于单个元素的辅助函数,但我不知道如何从 FSM 类型中提取它们。

4

2 回答 2

4

你可以这样提取:

fsmGetQ (q, _, _, _) = q
于 2013-10-07T01:44:22.437 回答
1

列表理解需要一个列表,而不是元组,这就是您收到此错误的原因。除了@Sibi 的回答,我建议您将类型更改为比多元素元组更方便和可读的类型。

要么使用实际的数据类型(考虑为最后一个元组创建嵌套数据类型):

data FSM = FSM [Int] Int [Int] [(Int,Char,Int)] deriving (Show)

testFSM :: FSM
testFSM = FSM [ 1, 2, 3 ] 1 [ 3 ] [ ( 1, 'a', 2 ), ( 2, 'b', 3 ), ( 1, 'b', 1 ) ]

fsmGetQ (FSM q _ _ _) = q

...或记录:

data FSM2 = FSM2 {
    getQ :: [Int],
    getQ0 :: Int,
    getF :: [Int],
    getD :: [(Int,Char,Int)]}
    deriving (Show)

testFSM2 :: FSM2
testFSM2 = FSM2 {
    getQ = [ 1, 2, 3 ],
    getQ0 = 1,
    getF = [ 3 ],
    getD = [ ( 1, 'a', 2 ), ( 2, 'b', 3 ), ( 1, 'b', 1 ) ]}

fsm2GetQ = getQ
于 2013-10-07T01:45:15.340 回答