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