Я нахожу это немного раздражающим, чтобы печатать
(+) 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 = flip f
сработает... но в вашем примере это не сохранит ни одной строки. - person ArunasR   schedule 25.10.2014f :: [a] -> [a] -> [a]
- person ArunasR   schedule 26.10.2014