使用递归方案库,可以轻松编写抽象语法树和相应的表达式评估器:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE LambdaCase #-}
import Data.Functor.Foldable
import Data.Functor.Foldable.TH
data Expr = Plus Expr Expr
| Mult Expr Expr
| Const Expr
deriving (Show, Eq)
makeBaseFunctor ''Expr
-- Write a simple evaluator
eval :: Expr -> Int
eval = cata alg
where
alg = \case
PlusF x y -> (+) x y
MultF x y -> (*) x y
ConstF x -> x
现在看一下alg
where 子句中函数中的 case eval
。我认为所有的x
和y
变量都不应该是必要的。因此,我正在寻找某种方法(语法、语言扩展等)来删除这个样板,然后写:
PlusF -> (+)
MultF -> (*)
ConstF -> id