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

时间:2015-04-03 13:00:12

标签: haskell

所以我得到了这段代码,它会在它的预期类型上返回一个错误。

无法匹配预期类型'[(Char,b0)]'
实际类型'(Char,Int)' 在表达式中:newList
在列表理解的一个方面:(a,b)< - newList

我想要回到角色的位置,这样就是'b'。我只是不明白为什么它给我一个类型错误。每当我在WinGHCI中逐个运行代码时,我都会得到正确的信息。将它放在.hs文件中时,它不会。

word = "apple"
isPart :: Char -> a
isPart x = do
            newList <- zip word [0..length word]
            result <- [b | (a,b) <- newList, a == x]
            return result

1 个答案:

答案 0 :(得分:6)

do区块内

newList <- zip word [0..length word]

被贬低为类似

的东西
zip word [0..length] >>= \newList -> ...

>>=的类型为(Monad m) => m a -> (a -> m b) -> m b

由于zip返回一个列表,您使用的是列表monad,因此newList的类型实际上是(Int, Char)。然后,您无法将其用作后续列表推导的源。

但您根本不需要使用do

isPart :: Char -> Int
isPart x = let newList = zip word [0..length word]
               result = [b | (a,b) <- newList, a == x]
           in  head result

虽然请注意,如果给定字符不在word

中,则会抛出错误

您也可以更简单地将其写为

import Data.List (elemIndex)
import Data.Maybe (fromJust)

isPart x = fromJust $ elemIndex x word

虽然更好的解决方案是将返回类型更改为Maybe Int,而不是使用fromJust