2013-10-07 50 views
1

我正在处理一个类的Haskell问题,我似乎无法获得将某个项目拉出自定义类型的语法。这里的类型: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

您可以提取像这样:

fsmGetQ (q, _, _, _) = q 
+0

这做到了。非常感谢你。 –

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 
+0

谢谢。我会,但是FSM类型是为作业定义的。 –