Last active
December 27, 2015 04:39
-
-
Save simodima/7268617 to your computer and use it in GitHub Desktop.
Standard ML Examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(* Type checker *) | |
fun fReal (x) = x + 0.0; | |
fun fInteger (x) = x + 0; | |
(* | |
if true then fReal(3.0) else fInteger(3); | |
Error: types of if branches do not agree !! | |
*) | |
(* call by value *) | |
fun myif a b c = if a then b else c; | |
fun fact n = myif (n=0) 1 (n* fact(n-1)); | |
(* infinite execution | |
fact 3 | |
myif false 1 (3 * fact 2) | |
myif false 1 (2 * fact 1) | |
myif false 1 (1 * fact 0) | |
myif true 1 (0 * fact -1) | |
the myif execution cause fact -1 evaluation and the infinite execution | |
*) | |
(* scope *) | |
val x = 2; | |
val x = 4 and y = x + 1; | |
(* at the second line "x" has the value 2 *) | |
(* pattern matching *) | |
val p = (true, 10); | |
val (left , right) = p; | |
(*the pattern order is important | |
fun wrong_fact n = n*wrong_fact(n-1) | |
| wrong_fact 0 = 1; | |
*) | |
(* wrong_fact 8; Error because redundant match 0*) | |
fun fact 0 = 1 | |
| fact n = n * fact(n-1); | |
fact 3; | |
(* records and record wildcards *) | |
val r = {name = "ric", age = 50}; | |
val {name = n, ...} = r; | |
(* the second expression the "ric" value to n *) | |
(* polymorphism: monotypes & polytypes *) | |
fun incFirst (x, y) = (x+1, y); | |
incFirst(90, 30); | |
(* the identity function *) | |
val id = fn x => x; | |
id "STR"; | |
id 30; | |
id 3.9; | |
(* equals *) | |
fun equals a b = (a = b); | |
(* equals id 4; it fails at runtime because operator and operand don't agree *) | |
(* a function that return the first arg *) | |
fun first x y = x; | |
first (fn x:int => x) 10; | |
(* is the same of first *) | |
val ufst = fn x => fn y => x; | |
ufst (fn x:int => x) 10; | |
(* higher order functions *) | |
fun compose f g x = f(g x); | |
fun negative x = ~x; | |
compose negative negative ~10; | |
compose negative negative 10; | |
(* sum *) | |
fun sum f 0 = 0 | |
| sum f n = (f n) + sum f (n-1); | |
sum id 8; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment