2010-07-29 2 views

Répondre

2

%? a trop haute priorité et est laissée associative, de sorte que v %? \z -> z * 2 %? \z -> z + 3 est le même que v %? \z -> z * (2 %? \z -> z + 3).

Si vous voulez %? à se comporter comme $ utilisation infixr 0 %?, il a la même priorité et l'associativité que $.

+0

qui était assez rapide, merci! – user406288

2

Eh bien, il serait utile de savoir ce que vous étiez attend à faire. Mais peut-être il serait utile de mettre des parenthèses explicites dans p:

q :: Int -> Int 
q v = v %? (\z -> z * (2 %? (\z -> z + 3))) 

Peut-être que vous vous attendiez quelque chose comme ceci:

p2 :: Int -> Int 
p2 v = v %? (\z -> (z * 2) %? (\z -> z + 3)) 

Il est probablement une bonne idée d'ajouter une déclaration infix pour tous les opérateurs vous déclarez, pour éviter ce genre de confusion. Les opérateurs arithmétiques ont une préséance moyenne, mais compte tenu de la fonction, vous voulez probablement une préséance très faible de toute façon. En aparté, les lambdas s'étendent tout à fait vers la droite, mais je suppose que ce n'est pas ce qui vous fait trébucher.

+0

excellent travail, merci! – user406288

Questions connexes