第一次使用haskell并且我一直遇到这个问题:
Couldn't match expected type `([Char], b0)'
with actual type `[[Char]]'
In the first argument of `fst', namely `moves'
In the second argument of `rotatedMaze', namely `(fst moves)'
我无法弄清楚发生了什么。我的参数错误在哪里?
manyPlayersManyRotations :: [[Char]] -> [[Char]] -> [[Char]]
manyPlayersManyRotations maze moves =
if null moves
then maze
else
let
rmaze = rotatedMaze maze (fst moves)
drop1 = dropPlayer rmaze '1'
opor1 = (fst drop1, snd drop1)
drop2 = dropPlayer (fst opor1) '2'
opor2 = (fst drop2, snd opor2 || snd drop2)
drop3 = dropPlayer (fst opor2) '3'
opor3 = (fst drop3, snd opor2 || snd drop3)
drop4 = dropPlayer (fst opor3) '4'
opor4 = (fst drop4, snd opor2 || snd drop4)
in
if (not)(snd opor4)
then fst opor4
else manyPlayersManyRotations (fst opor4) (tail moves)
rotatedMaze :: [[Char]] -> [Char] -> [[Char]]
rotatedMaze maze move =
if move == ['c']
then rc maze
else if move == ['c','c']
then rcc maze
else r180 maze
答案 0 :(得分:5)
fst
想要一个元组,但你给了它一个列表。
fst
的类型是:
fst :: (a, b) -> a
错误消息的第一行
Couldn't match expected type `([Char], b0)'
表示调用fst
时参数的预期类型为([Char], b0)
。 [Char]
位是从上下文推断出来的,而b0
只意味着它不关心第二种类型是什么(因为fst
只丢弃第二个元组元素)。
错误消息的第二行
with actual type `[[Char]]'
说你传给了[[Char]]
,因为......好吧,那就是你所做的。
也许你所指的是fst
而不是head
,它给出了列表的第一个元素。
答案 1 :(得分:2)
fst
和snd
是为2元组定义的,此处您的参数是列表[[Char]]
。