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

Hes*_*pen 0 haskell

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

无法将预期类型'[(Char,b0)]'
与实际类型'(Char,Int)'
匹配
在表达式中:newList 在列表推导的stmt中:(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
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 6

你的do街区内

newList <- zip word [0..length word]
Run Code Online (Sandbox Code Playgroud)

被贬低成类似的东西

zip word [0..length] >>= \newList -> ...
Run Code Online (Sandbox Code Playgroud)

类型>>=(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
Run Code Online (Sandbox Code Playgroud)

虽然请注意,如果给定的字符不在,则会抛出错误 word

你也可以更简单地写这个

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

isPart x = fromJust $ elemIndex x word
Run Code Online (Sandbox Code Playgroud)

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