以下程序類型檢查和編譯:評價一個AST(作爲GADT)與如箭頭原子值
import Control.Arrow
data Ns = Na | Nb | Nc | Nd deriving Show
data Net a where
Uni :: a -> Net a
Serial :: Net a -> Net a -> Net a
Branch :: Show a => Net a -> Net (Net a, Net a)
deriving instance Show a => Show (Net a)
eval :: (Arrow a) => Net c -> a b (Net c)
eval (Uni m) = arr (const (Uni m))
eval (Serial m n) = eval m >>> eval n
--eval (Branch m) = eval m &&& eval m
example = Serial (Serial (Uni Na) (Uni Nb)) (Serial (Uni Nc) (Uni Nd))
main = do
putStrLn $ show (app (eval example, Na))
然而,當我嘗試添加的情況下爲eval (Branch m)
,類型檢查彈出。類型
Arrow a => a b (Net d)
的事情的預期,但當然我的方式有很
Arrow a => a b (c',c'')
沒有人有怎樣寫eval (Branch m)
有何建議?
編輯我
針對@sabauma評論,我認爲eval
類型簽名將不得不改變,但我不知道它應該是什麼。
編輯II
下面是應該發生的事情爲例:
branch = Branch example
app (eval branch, Na)
應該給,
Uni (Uni Na,Uni Na)
這是@sabauma的建議一樣。
你確定發佈的代碼類型檢查?即使最後一個案例已被註釋掉,我仍然會遇到一個類型錯誤,涉及您在「eval」上簽名。 GHC推斷出類型'eval :: Arrow a => Net a - > a(Net a)(Net a)'。 – sabauma 2013-03-13 13:52:20
@sabauma我糾正了'eval'的類型聲明。至少,在嘗試添加'eval(Branch m)' – lafras 2013-03-13 14:16:59
之前,將它改回原來的樣子。您應該明確地添加一些預期輸出的示例或對語義的進一步解釋。根據您提供的信息,很難猜測出「eval」應該做什麼。 – phg 2013-03-13 15:21:20