我代表演算哈斯克爾以下代數數據類型:哈斯克爾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 –