2016-06-06 17 views
3
fun p(x::xl) = 
    if x::xl = [] then [] 
    else [0]; 

Es erhielt eine Warnung: Übereinstimmung nicht erschöpfend.Übereinstimmung nicht erschöpfend in sml

x :: XL => ...

Was will ich tun:

p ([]) = []

Wenn ich dies tun, ist es eine abgefangene Ausnahme gibt Match [nicht erschöpfende Match-Fehler]

Antwort

7

Was Sie testen, x::xl = [], wird niemals wahr sein. Listen sind algebraische Typen und sind definiert als

datatype 'a list = :: of 'a * 'a list 
       | [] 

Wert bedeutet, dass eine Liste ist entweder die leere Liste oder ein Element setzen vor einer anderen Liste.

Sobald Ihre ursprüngliche Mustererkennung von x::xl erfolgreich war, wissen Sie, dass es nicht leer ist. (Das sollte aber ziemlich klar sein, denn was würde es x zuweisen, wenn x::xl leer war; das erste Element der leeren Liste?)

Sie scheinen hier zwei Stile zu mischen, einer ist Mustererkennung und der andere Sein Wenn-dann-sonst.

fun p [] = [] 
    | p (_::_) = [0] 

fun p xs = if List.null xs then [] else [0]