以下程序类型检查和编译:
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 评论的回应,我认为 for 的类型签名eval
将不得不改变,但我不确定它应该是什么。
编辑二
这是应该发生的事情的示例:
branch = Branch example
app (eval branch, Na)
应该给,
Uni (Uni Na,Uni Na)
这就是@sabauma 的提议所做的。