2012-04-14 66 views
1

我有這樣的功能:哈斯克爾的數據類型錯誤

data Memory = Memory 
    {visited::[Point] 
    ,dfsstack::[Point] 
    ,currentPoz::Point 
    }deriving(Eq) 
perceiveAndAct :: SVal -> [Cardinal] -> a -> (Action, a) 
perceiveAndAct s cs m 
    | elem W cs == True && elem N cs == True && elem E cs == True && elem S cs == False = (Just S, Memory (visited m) (dfsstack m) (currentPoz m)) 

把米,而不是Memory (visited m) (dfsstack m) (currentPoz m)工作正常,否則,它給了我:

Couldn't match expected type `(a, b)' 
      against inferred type `Memory -> Point' 
    In the first argument of `fst', namely `currentPoz' 
    In the first argument of `($)', namely `fst currentPoz' 
    In the expression: fst currentPoz $ currentPoz m 

可能是什麼問題呢?

+2

錯誤信息所指的'fst currentPoz $ currentPoz m'在哪裏? – hammar 2012-04-14 18:52:16

+1

順便說一句,無論你有什麼'blah == True',你都可以簡化爲'blah'(例如,簡化'elem W cs == True'到'elem W cs')。同樣,您可以將'elem S cs == False'簡化爲'notElem S cs'。 – dave4420 2012-04-14 20:26:18

回答

-1

visiteddfsstackcurrentPoz是函數,它們不構造列表。

你想寫Memory [m] [m] m,而不是。

visiteddfsstack,和currentPoz是哪個,給出someData :: Memory,可以提取每個元件的功能。

你還需要的perceiveAndAct的說法從0​​‘m’的類型更改爲:: Point

5

你給perceiveAndAct的種類非常多態。比較:

id :: a -> a 
id m = m -- the only correct implementation 
id m = Memory (visited m) (dfsstack m) (currentPoz m) -- type error 
-- only works for Memory, not all possible a 

idMemory :: Memory -> Memory 
id m = m -- this is fine 
id m = Memory (visited m) (dfsstack m) (currentPoz m) -- also correct 

不過,我有點困惑,因爲你粘貼的類型錯誤時,我讓你聲稱你所做的更改不匹配類型的錯誤,我得到。也許你最好將你使用的確切代碼粘貼到你得到的確切錯誤上,而不是正確的代碼和我們無法看到的一些隱形代碼的錯誤。