考虑一组n
个数字(例如4个数字{1, 2, 3, 4}
),以及一组二进制{+, -, *, /}
和一元运算符{ln, exp, sin}
。使用每个数字一次组合这些,使用任何运算符,其中一个数字最多可应用于一元运算符一次。例如:1+2+3-4
或sin(1)*4 + log(2) + 3
。现在,计算所有可能的表达式,显示结果超过0
的所有表达式。
我们可以使用前缀操作将它们链接到Haskell中的无点样式函数:
(+) 1 . (+) 2 . (-) 3 $ 4
(+) 3 . (+) (log 2) . (*) 4 $ (sin 1)
是否存在functor / monad / applicative方法来获取所有可能的链,这些链将每个数字与所有可能的运算符组合在一起,而不重复数学上等效的表达式w.r.t.这些二元运算符的可交换属性,例如1+2=2+1
,2*3=3*2
?