无法匹配预期类型'([Char],b0)'实际类型' [[Char]]'

时间:2016-03-20 23:21:26

标签: haskell types

第一次使用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

2 个答案:

答案 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)

fstsnd是为2元组定义的,此处您的参数是列表[[Char]]