我代表演算哈斯克尔以下代数数据类型:哈斯克尔LAMBDA倍
data LExpr
= Var String -- variable
| App LExpr LExpr -- function application
| Lam String LExpr -- Lambda abstraction
deriving (Eq, Show)
我试图建立与之相适应折叠功能。我与一般的折叠形式代数数据类型,它可以是这样的方式存在认识:
foldr :: (α -> β-> β) -> β -> [α] -> β
foldr (#) z = go
where
go [] = z
go (x:xs) = x # go xs
所以,我迄今所做的:
lfold :: (String -> a) -> (a -> a -> a) -> (String -> a -> a) -> LExpr -> a --given by definition
lfold f z = go
where
go (Var _) = z --Not sure here how to do the base case
go (Lam v e) = v f go e
这是正确的方法是什么?如果不是,我错了,如何解决它?
看看你的签名,它与'foldr'不同,你应该命名变化的变量。还要记住用圆括号包装你的构造函数。例如'v f go e'的类型为'String','String - > a','LExpr - > a'和'LExpr',这是一个无意义的调用链。 – Guvante
@Guvante确定那么对应的签名是什么? – user8
http://stackoverflow.com/questions/16426463/what-constitutes-a-fold-for-types-other-than-list –