Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Programming in F# Recall that an F# function that takes two arguments can be cod

ID: 3872875 • Letter: P

Question

Programming in F#

Recall that an F# function that takes two arguments can be coded in either uncurried form (in which case it takes a pair as its input) or curried form (in which case it takes the first argument and returns a function that takes the second argument). In fact it is easy to convert from one form to the other in F#. To this end, define an F# function curry f that converts an uncurried function to a curried function, and an F# function uncurry f that does the opposite conversion.

For example,

> (+);;

val it : (int -> int -> int) = > let plus = uncurry (+);;

val plus : (int * int -> int)

> plus (2,3);;

val it : int = 5

> let cplus = curry plus;;

val cplus : (int -> int -> int)

> let plus3 = cplus 3;;

val plus3 : (int -> int)

> plus3 10;;

val it : int = 13

What are the types of curry and uncurry?

Explanation / Answer

In the Notes on Programming Language Syntax page, an example parser for a simple language is given, using C syntax. Write the parser using F#, but you may only use functional programming and immutable date.  Create the list of tokens as a discriminated union, which (in the simplest case) looks like an enumeration.           type TERMINAL = IF|THEN|ELSE|BEGIN|END|PRINT|SEMICOLON|ID|EOF With this type declared, you can use the terminals like you would use enumerated values in Java. Use immutable data. The C-code example uses mutable data. Pass the program into the start symbol function. Pass the input yet to be processed to each non-terminal function.