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))

代わりに 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

何が問題なのですか?

4

2 に答える 2

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

ただし、貼り付けた型エラーは、あなたが行ったと主張した変更を行ったときに発生する型エラーと一致しないため、少し混乱しています。おそらく、正しいコードと目に見えないコードのエラーではなく、エラーを発生させた正確なコードを、取得した正確なエラーと一緒に貼り付けた方がよいでしょう。

于 2012-04-14T18:49:16.680 に答える
-1

visiteddfsstack、およびcurrentPozは関数であり、リストを作成しません。

代わりに を書きたいと思いますMemory [m] [m] m

visiteddfsstack、およびは、 を指定すると、これらの各要素を抽出できるcurrentPoz関数です。 someData :: Memory

perceiveAndActまた、の引数「m」の型を から:: aに変更する必要があります。:: Point

于 2012-04-14T18:44:56.867 に答える