Haskell - 从自定义类型返回项目

时间:2013-10-07 01:24:27

标签: haskell types

我正在研究一个类的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类型中提取它们。

2 个答案:

答案 0 :(得分:4)

你可以像这样提取:

fsmGetQ (q, _, _, _) = q

答案 1 :(得分: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