Το if ... then ... else ...
είναι ένα case
αλλά όχι το case
που λες εδώ. Συγκεκριμένα το παρακάτω case:
case <booleanExpr> of
true => <expr1>
false => <expr2>
είναι ισοδύναμο με το παρακάτω if:
if <booleanExpr> then <expr1> else <expr2>
Στην περίπτωση που έχεις εδώ το αντίστοιχο case είναι:
local
val M = 5
in
fun isit5 n =
case n = M of
true => true
false => false
end
Στο pattern matching όντως αυτό που γίνεται είναι ότι το M
μέσα στην isit5
θα γίνει bound με την τιμή του n
(και άρα το _
είναι redundant). Αυτή είναι και μία από τις δουλειές του pattern matching (να κάνει δηλαδή destructuring και bind σε φρέσκες μεταβλητές). Γενικά δεν νομίζω οτι μπορείς μέσα σε pattern να χρησιμοποιήσεις προηγούμενη μεταβλητή, γιατί αλλιώς χάνεις την παραπάνω λειτουργικότητα.
Αυτό που θες εσύ να κάνεις μπορεί να υλοποιηθεί με κάποιο test ισότητας, όπως κάνεις και με το if then else
. Η συγκεκριμένη συνάρτηση βέβαια μπορεί να υλοποιηθεί και πιο μινιμαλιστικά ως εξής:
local
val M = 5
in
fun isit5 n = n=M
end
αλλά δεν ξέρω αν αυτό είναι κάτι που σε ενδιαφέρει.