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