【发布时间】:2018-02-03 17:43:30
【问题描述】:
使用recursion-scheme 库 编写抽象语法树和相应的表达式评估器很容易:
{-# 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
现在看看eval的where子句中alg函数的大小写。我认为所有的 x 和 y 变量
应该没有必要。因此,我正在寻找某种方式(语法、语言扩展等)
删除这个样板并写:
PlusF -> (+)
MultF -> (*)
ConstF -> id
【问题讨论】:
标签: haskell syntax boilerplate recursion-schemes