Коммутативное сопоставление с образцом

Я нахожу это немного раздражающим, чтобы печатать

(+) 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

Хотя я предполагаю, что он должен работать немного хуже, поскольку он должен проверять все шаблоны, затем переворачивать и снова проверять.


person MrNosco    schedule 25.10.2014    source источник
comment
Я не удивлюсь, если f = flip f сработает... но в вашем примере это не сохранит ни одной строки.   -  person ArunasR    schedule 25.10.2014
comment
Я не знаю, как это сделать, но идея мне нравится. Я предполагаю, что это было бы выгодно только для доменов по сравнению с конечным набором, где вы соответствуете шаблону для каждого значения, правильно, хотя .... Я ошибаюсь? В этом случае, я полагаю, вы могли бы заполнить верхнюю диагональ, а затем использовать случай по умолчанию, который переворачивает и рекурсивно вызывает, что-то вроде упомянутого @arunasr, нет?   -  person jamshidh    schedule 25.10.2014
comment
Может быть, монада коммутативности могла бы помочь? github.com/gelisam/commutative   -  person danidiaz    schedule 25.10.2014
comment
@arunasr Я не мог заставить f = flip f работать, ghci жалуется на разное количество аргументов. Хотя ваш комментарий привел меня к решению, которое я добавил в OP   -  person MrNosco    schedule 25.10.2014
comment
Не стесняйтесь публиковать ответ на свой вопрос.   -  person Christian Conkle    schedule 25.10.2014
comment
@user1433771 user1433771 Я полагаю, что жалобу gchi можно отключить с помощью явной подписи типа, например f :: [a] -> [a] -> [a]   -  person ArunasR    schedule 26.10.2014
comment
Функциональная область @jamshidh не обязательно должна быть конечной; у вас может быть бесконечное количество поддоменов, определяемых охранниками.   -  person ArunasR    schedule 26.10.2014


Ответы (1)


Благодаря комментариям у меня есть способ

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

Хотя я предполагаю, что он должен работать немного хуже, поскольку он должен проверять все шаблоны, затем переворачивать и снова проверять.

person MrNosco    schedule 26.10.2014