假设我用 GHCi 写:
GHCi> let x = 1 + 2 :: Integer
GHCi> seq x ()
GHCi> :sprint x
Run Code Online (Sandbox Code Playgroud)
GHCix = 3按自然预期打印。
然而,
GHCi> let x = 1 + 2
GHCi> seq x ()
GHCi> :sprint x
Run Code Online (Sandbox Code Playgroud)
产量 x = _
这两个表达式之间的唯一区别是它们的类型 ( Integervs Num a => a)。我的问题是究竟发生了什么,为什么x在后一个例子中似乎没有评估。
我的问题是如何将递归的、F 代数风格的递归类型定义与 monadic/applicative 风格的解析器结合起来,以适应现实的编程语言。
我刚刚开始使用以下Expr定义:
data ExprF a = Plus a a |
Val Integer deriving (Functor,Show)
data Rec f = In (f (Rec f))
type Expr = Rec ExprF
Run Code Online (Sandbox Code Playgroud)
我试图将它与使用变形的解析器结合起来:
ana :: Functor f => (a -> f a) -> a -> Rec f
ana psi x = In $ fmap (ana psi) (psi x)
parser = ana psi
where psi :: String -> ExprF String
psi = ???
Run Code Online (Sandbox Code Playgroud)
据我所知,在我的示例中,psi应该只解析一个整数,或者它应该决定字符串是 a<expr> + <expr>然后(通过递归调用 …