2015-04-03 207 views
0

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

不能匹配预期类型 '[(CHAR,B0)]'
与实际类型 '(CHAR,智力)'
在表达式:newList
在列表解析的语句:(A, b)< - newList

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

我想获取字符的位置,所以这将是'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 

回答

6

里面你do

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

被脱到像

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

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

由于zip返回一个列表,因此您使用的是单子列表,因此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

你也可以写这个更简单as

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

isPart x = fromJust $ elemIndex x word 

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

相关问题