【发布时间】:2016-05-09 15:22:35
【问题描述】:
这是我的项目,也是我之前问题的延续。
这是我的代码的基本部分。
data Lukasiewicz = C | I | U
deriving (Eq, Show, Ord)
data LExpTree a = L a
| V [Char]
| N (LExpTree a)
| Q (LExpTree a)
| S (LExpTree a)
| K (LExpTree a)
| A ((LExpTree a), (LExpTree a))
| O ((LExpTree a), (LExpTree a))
| E ((LExpTree a), (LExpTree a))
| M ((LExpTree a), (LExpTree a))
deriving (Show, Eq)
type Dict = [(String, Lukasiewicz)]
type Unary a b = a -> b
type Unary2 a = a -> a
type Binary b = b -> b -> b
fold :: LExpTree a -> Unary a b -> Unary [Char] b -> Unary2 b -> Unary2 b -> Unary2 b -> Unary2 b -> Binary b -> Binary b -> Binary b -> Binary b -> b
fold (L x) l v n q s k a o e m = l x
fold (V x) l v n q s k a o e m = v x
fold (N x) l v n q s k a o e m = n (fold x l v n q s k a o e m)
fold (Q x) l v n q s k a o e m = q (fold x l v n q s k a o e m)
fold (S x) l v n q s k a o e m = s (fold x l v n q s k a o e m)
fold (K x) l v n q s k a o e m = k (fold x l v n q s k a o e m)
fold (A x) l v n q s k a o e m = a (fold (left' x) l v n q s k a o e m) (fold (right' x) l v n q s k a o e m)
fold (O x) l v n q s k a o e m = o (fold (left' x) l v n q s k a o e m) (fold (right' x) l v n q s k a o e m)
fold (E x) l v n q s k a o e m = e (fold (left' x) l v n q s k a o e m) (fold (right' x) l v n q s k a o e m)
fold (M x) l v n q s k a o e m = m (fold (left' x) l v n q s k a o e m) (fold (right' x) l v n q s k a o e m)
evalT :: Dict -> LExpTree Lukasiewicz -> Lukasiewicz
evalT xs x = fold x id (lk xs) negation possible sure unknown (<&>) (<|>) (<->) (-->)
最后一个函数evalT 将采用Dict 和Expression Tree 并将输出该表达式的结果,前提是用户将在@987654327 的表达式树中为V [Char] 的所有变量提供值@列表。
现在我需要创建一个新函数来评估表达式树。
这一次,输入不会有Dict。因此,输出不是结果,而是所有变量名的列表。
我的想法是使用相同的fold 函数并忽略除V [Char] 之外的所有内容。其余的应该只调用表达式树,而不应该做任何其他事情。
但我不知道如何开始。
函数的签名应该是
varList :: LExpTree Lukasiewicz -> [String]
【问题讨论】:
-
fold接受 so 很多参数而没有实际使用它们(除了将它们传递给递归调用)这一事实表明fold实际上并不需要这么多争论。 -
我也在想同样的事情。那么对于这个新功能,我是不是应该新建一个
fold呢?或某事?我想不出办法开始。