2012-04-14 12 views
1

私はこの機能があります:問題がある可能性がどのようなHaskellのデータ型エラー

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 

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)は、それが私のことを与えて、他の、正常に動作しますか?

+2

エラーメッセージが参照している 'fst currentPoz $ currentPos m'はどこですか? – hammar

+1

Btwはどこにでも 'blah == True'を持っています。単純に' blah'に単純化することができます(例えば 'elem W cs == True'を' elem W cs'に単純化する)。同様に、 'elem S cs == False'を' notElem S cs'に単純化することもできます。 – dave4420

答えて

-1

visited,dfsstackおよびcurrentPozは機能であり、リストを構成しない。

代わりにMemory [m] [m] mと書いてください。

visited

dfsstack、及びcurrentPozは、someData :: Memoryを与え、機能しているこれらの各要素を抽出することができます。

また、あなたがperceiveAndActを与えたタイプは非常に多型である:: aから:: Point

5

からperceiveAndActの引数 『M』の種類を変更する必要があります。比較:

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 

をしかし、私はあなたが貼り付けタイプのエラーは型エラーと一致していないので、私はあなたが作っ主張変更を行うときに私が取得、少し混乱しています。おそらく、使用している正確なコードを貼り付けて、正しいコードと表示されない不可視コードのエラーではなく、正確なエラーとエラーを貼り付ける方がよいでしょう。