2015-04-03 85 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

相關問題