Эта нотация с инфиксом Python 3 не работает, и я не понимаю, почему

Я пытался закодировать какую-то теорию категорий. Одним из требований является ассоциативность, поэтому "(ab) c = a (bc)" Пытаясь закодировать это с помощью модуля infix, я обнаружил, что моя версия правой части ("a (bc)") не работает правильно. Кто-нибудь может подсказать, что я делаю не так?


import infix #from https://pypi.python.org/pypi/infix/  #Thanks for the module!
from infix import or_infix

# Uses the "or" sign | around infix functions, eg "then(a,b)" becomes "a |then| b"
# Function "then(a,b)" also works and I use it first in the test below
@or_infix 
def then(f,g):
    '''returns a function that = g(f())'''
    #assertion tests make sure arguments are functions, ie that they can be called.
    assert callable(f)
    assert callable(g)
    def h(x):
        return g(f(x))
    return h


def m5(x):
    print("m5 is subtracting 5")
    return x-5

def p5(x):
    print("p5 is adding 5")
    return x+5

def double(x):
    print ("double is multiplying by 2")
    return 2*x

x = 0
print ("Setting the arg x to 0")


print("Using function language:")
print( then(m5,then(p5, double))(x) ) #This works and gives 0
print()
print("|then| with abbreviations:") 
pd = p5 |then| double
print((m5 |then| pd)(x)) #This works and gives 0
print()
print("Straight-through with |then|")  
print((m5 |then| p5 |then| double)(x)) #This works and gives 0
print()
print("Using |then| language with parentheses:") 
print( (m5 |then| (p5 |then| double ))(x) ) #The problem code
#This last does not work. p5 runs twice, m5 not at all.  Why, though?

0 ответов

Другие вопросы по тегам