Em suma, não há operações de subtração particularmente úteis em strings com as quais as pessoas desejem escrever algoritmos.
O operador +
geralmente denota a operação de um aditivo monoid , ou seja, uma operação associativa com uma identidade elemento:
- A + (B + C) = (A + B) + C
- A + 0 = 0 + A = A
Faz sentido usar esse operador para coisas como adição de inteiros, concatenação de strings e união de conjuntos, porque todos eles têm a mesma estrutura algébrica:
1 + (2 + 3) == (1 + 2) + 3
1 + 0 == 0 + 1 == 1
"a" + ("b" + "c") == ("a" + "b") + "c"
"a" + "" == "" + "a" == "a"
E podemos usá-lo para escrever algoritmos úteis, como a função concat
, que funciona em uma sequência de itens "concatenáveis", por exemplo:
def concat(sequence):
return sequence.reduce(+, 0)
Quando a% de subtração-
é envolvida, você costuma falar sobre a estrutura de um grupo , que adiciona um inverso −A para cada elemento A, de modo que:
- A + −A = −A + A = 0
E, embora isso faça sentido para coisas como subtração de ponto flutuante e inteiro, ou até mesmo para definir a diferença, isso não faz muito sentido para cadeias de caracteres e listas. Qual é o inverso de "foo"
?
Existe uma estrutura chamada monoid cancelativa , que não tem inversos, mas tem o propriedade de cancelamento , de modo que:
- A - A = 0
- A - 0 = A
- (A + B) - B = A
Esta é a estrutura que você descreve, onde "ab" - "b" == "a"
, mas "ab" - "c"
não está definido. É só que não temos muitos algoritmos úteis que usam essa estrutura. Eu acho que se você pensar em concatenação como serialização, então a subtração poderia ser usada para algum tipo de análise.