Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use parentheses to disambiguate an expression like `liftM b ap c`

Tags:

haskell

frege

While in Haskell, the following works:

> (+) `liftM` (Just 3) `ap` (Just 5)
Just 8

Frege hints to use parantheses:

frege> (+) `liftM` (Just 3) `ap` (Just 5)
E <console>.fr:12: invalid expression, none-associative operator liftM
    found on same level as none-associative operator ap
H <console>.fr:12: Use parentheses to disambiguate an expression like a
    liftM b ap c

I found this section in Haskell report:

Expressions involving infix operators are disambiguated by the operator's fixity (see Section 4.4.2). Consecutive unparenthesized operators with the same precedence must both be either left or right associative to avoid a syntax error. Given an unparenthesized expression "x qop(a,i) y qop(b,j) z", parentheses must be added around either "x qop(a,i) y" or "y qop(b,j) z" when i=j unless a=b=l or a=b=r.

In the code above, both the "operators" have no associativity and have the same default precedence so it seems like Frege's behavior is consistent with Haskell report.

Am I understanding this right? Why Frege needs parentheses in this case whereas Haskell is able to disambiguate? or How is Haskell able to disambiguate in this case?

like image 704
Marimuthu Madasamy Avatar asked Jan 01 '26 02:01

Marimuthu Madasamy


1 Answers

Well, this is because, as it stands, `foo` defaults to non-associativity In Frege, while in Haskell is it left associativity.

This should be corrected in the Frege compiler in order to make it more Haskell compatible.

like image 119
Ingo Avatar answered Jan 02 '26 22:01

Ingo