簡體   English   中英

SML-NJ列表等於Nil vs Null List

[英]SML-NJ List Equals Nil vs Null List

我對新澤西州SML解釋列表的方式有疑問:

假設我有一個函數f(x : 'a, n : int) : 'a list ,使得f返回xn副本的列表,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM