[英]SML-NJ List Equals Nil vs Null List
我對新澤西州SML解釋列表的方式有疑問:
假設我有一個函數f(x : 'a, n : int) : 'a list
,使得f
返回x
的n
副本的列表,例如f(2,5) = [2,2,2,2,2]
, f(9,0) = []
。
那么我進入REPL,我檢查f(9,0) = nil
,然后返回true。 從這里,我假設您可以使用list = nil
來檢查list
是否為空列表。 我在一個函數中使用它,它不會運行。 我最后得知類型定義不同:
sml:121.2-123.10錯誤:運算符和操作數不一致[需要相等類型]運算符域:''Z *''Z
操作數:'列表*'Y列表
表達式:
xs =零
(其中xs是我的名單)。 然后我了解到檢查列表是否為空列表的方法是使用null list
。 為什么會這樣? nil
發生了什么事? 有人可以向我解釋這種行為嗎?
我也注意到(case xs = of nil
顯然(case xs = of nil
與檢查null xs
相同。這是否意味着nil是一種類型?
這是與多態性相關的錯誤。 默認情況下,評估空列表時,其類型為'a list
。 這意味着列表可以包含任何類型的元素。 如果您嘗試評估1::[]
,則不會因此而出現類型錯誤。 這稱為多態,它是一個允許函數接受任何類型參數的功能。 這在null
這樣的函數中很有用,因為在這種情況下你不關心列表的內容,你只關心它的長度(事實上,你只關心它是否為空)。 但是,您也可以使用不同類型的空列表。 您可以使函數返回一個空的int列表。 事實上,你在你的功能中這樣做。
這是您的功能的簡單實現的結果:
- fun f(x : 'a, n : int) : 'a list =
case n of
0 => []
| _ => x::f(x, n-1);
val f = fn : 'a * int -> 'a list
- f(4,5);
val it = [4,4,4,4,4] : int list
- f(4,0);
val it = [] : int list
如您所見,即使第二個參數為0,您的函數也會返回一個int列表。 您應該能夠直接與類型的名單進行比較'a list
。
- it = [];
val it = true : bool
但是,如果您嘗試比較具有不同類型且不是'a list
類型的兩個空列表,則應該收到錯誤。 你可以在下面看到它的一個例子:
- [];
val it = [] : 'a list
- val list1 : int list = [];
val list1 = [] : int list
- val list2 : char list = [];
val list2 = [] : char list
- list1 = [];
val it = true : bool
- list2 = [];
val it = true : bool
- list1 = list2;
stdIn:6.1-6.14 Error: operator and operand don't agree [tycon mismatch]
operator domain: int list * int list
operand: int list * char list
in expression:
list1 = list2
此外, case xs of nil
是一種檢查列表是否為空的方法,但這是因為nil
(這只是一種寫[]
)默認情況下具有類型'a list
。 (注意case表達式不直接返回一個布爾值。)因此, nil
不是一個類型,但是'a list
是一個多態類型,你可以將它與任何類型的列表進行比較,但是如果你的空列表沒有多態類型,你會得到一個類型錯誤,我認為你的情況發生了什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.