所以我得到了这段代码,它会在它的预期类型上返回一个错误。
无法匹配预期类型'[(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
答案 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
。