Haskell 交换模式匹配

Haskell 交换模式匹配,haskell,pattern-matching,commutativity,Haskell,Pattern Matching,Commutativity,我觉得打字有点烦人 (+) 0 a = a (+) a 0 = a (*) 0 _ = 0 (*) _ 0 = 0 -- etc. 下面或多或少是我想做的 f [] a = a f a [] = a f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs)) f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs) 有没有一种方法可以说明函数是可交换的?如中所示,是否有一种方法可以说明只要任何参数都是特定值,那么结果应该是

我觉得打字有点烦人

(+) 0 a = a
(+) a 0 = a
(*) 0 _ = 0
(*) _ 0 = 0
-- etc.
下面或多或少是我想做的

f [] a = a
f a [] = a
f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs))
f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs)
有没有一种方法可以说明函数是可交换的?如中所示,是否有一种方法可以说明只要任何参数都是特定值,那么结果应该是某某

我想,对于编译器编写人员来说,定义这样的行为一定很困难,但haskell已经多次让我感到惊讶

编辑:


多亏了我的评论,我想出了一个办法

f [] a = a
--f a [] = a
f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs))
--f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs)
f a b = f b a
f [] a = a
--f a [] = a
f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs))
--f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs)
f a b = f b a

尽管我认为它的性能一定会差一点,因为它必须检查所有的模式,然后翻转,然后再次检查。

多亏了我的评论

f [] a = a
--f a [] = a
f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs))
--f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs)
f a b = f b a
f [] a = a
--f a [] = a
f (1:1:as) (1:1:1:bs) = [0,0] ++ (f as (0:bs))
--f (1:1:1:as) (1:1:bs) = [0,0] ++ (f (0:as) bs)
f a b = f b a

虽然我认为它的性能一定会差一点,因为它必须检查所有的模式,然后翻转,然后再检查。

如果
f=flip f
有效,我不会感到惊讶……但它不会在您的示例中保存任何行。我不知道如何实现这一点,但我喜欢这个想法。我假设它只对有限集合上的域有利,在有限集合中,模式匹配每个值,对吗。。。。我错了吗?在这种情况下,我想你可以填写上对角线,然后使用一个默认的翻转和递归调用的情况,有点像@arunasr提到的,不是吗?也许“交换性单子”会有帮助@arunasr我无法让f=flip f工作,ghci抱怨“不同数量的争论”,尽管你的评论让我找到了一个解决方案,我将其添加到OPF中。请随意发布你自己问题的答案。