У меня есть следующий алгебраический тип данных, представляющий лямбда-исчисление в Haskell:
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
, которые представляют собой бессмысленную цепочку вызовов. - person Guvante   schedule 14.06.2015