haskell - 可交换模式匹配

标签 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)

有没有办法表明函数是可交换的?例如,有没有一种方法可以表明,只要任何参数是特定值,那么结果就应该是这样的?

我想对于编译器编写者来说,定义这样的行为一定非常困难,但我已经多次对 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

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

关于haskell - 可交换模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26564705/

相关文章:

c++ - boost 是否提供 make_zip_range?

haskell - 使用 DataKinds - 种类不匹配错误

function - 使用折叠插入

python - 为什么我翻译成 Python 的 Haskell 不能正常工作?

java - 为什么这个模式不匹配? ([\\\\A\\\\W]其[\\\\W\\\\z])

machine-learning - Syslog 上的异常检测

python - 括号的非交换扩展 (Python)

haskell - 编写与 GHC.Generics 一起使用的类型级函数

java - 匹配器查找第 n 个匹配索引

ruby - 为什么乘法在 Ruby 中并不总是可交换的?