2015-10-15 39 views
0

我有這個問題解決enter image description here數據類型列表操作

和我設法解決這個問題,但沒有該功能execute_ops。這是我的解決方案:

datatype list_op = insert of int*int | delete of int | setsize of int; 

exception wrong_case; 

fun insert(x,pos,nil) = [x] 
    | insert(x,pos,h::t) = if (pos=h) then x::h::t else h::insert(x,pos,t); 

fun setsize(0) = nil 
    | setsize(1) = [0] 
    | setsize(n) = 0 :: setsize(n-1); 

fun delete (l,0) = l 
    | delete (nil,_) = raise wrong_case 
    | delete (h::t,n) = if n = h then h::t else delete(t,n-1); 

insert(3, 4, delete(setsize(5), 3)); 

首先我不知道如果我的解決方案是正確的,因爲我不明白的setSize是什麼。

我怎樣寫我的代碼的正確方法是什麼?

謝謝

回答

1

所以對於這三個操作的,你似乎已經定義幫手函數執行的操作背後的邏輯。除此之外,除了修正這種邏輯以使其起作用外,還將這些功能拼接在一起形成功能execute_ops

  1. 如果這些值同時值構造你的數據類型的您不能命名功能insertdeletesetsize。簡單地說,一旦定義了數據類型,然後定義了同一個作用域中的函數,這些函數就會影響值構造函數,並且使您無法表示類型爲的列表list_op

    重要的,我懷疑混淆的一點是,insertdeletesetsize不是執行列表上的操作的函數。他們是值構造,就像leafnode是用於製作二叉樹:

    datatype tree = leaf | node of tree*int*tree 
    
  2. insert比較pos=h沒有意義。列表中的元素與他們的位置不同。你希望在位置pos插入X,不就是等於pos的第一要素。值不一定等於它在其中出現的列表中的位置。

  3. 而且delete是不幸的是完全沒有意義的;你的代碼說的是「如果數字n等於列表中的元素,則返回整個列表。否則,刪除元素並繼續刪除元素,直到出現這種情況,或者列表爲空。」

    delete引發異常也沒有根據該定義必要的。

  4. 我不知道你不理解的setSize是什麼意思。它應該是一個設置列表大小的操作。如果大小小於當前長度,請重複賦值文本,刪除過多的元素,否則使用零延長列表的末尾

這是解決分配的模板:

datatype list_op = insert of int*int | delete of int | setsize of int 

fun insert_h (0, elem, x::xs) = ... (* insert elem instead of x *) 
    | insert_h (pos, elem, []) = ... (* list was too short *) 
    | insert_h (pos, elem, x::xs) = ... (* not there yet *) 

fun setsize_h (0, xs) = ...   (* wonder what list has size 0 *) 
    | setsize_h (n, []) = ...   (* extend list n times more *) 
    | setsize_h (n, x::xs) = ...  (* not there yet *) 

fun delete_h (0, x::xs) = ...   (* delete element at this position *) 
    | delete_h (n, []) = ...   (* list was too short *) 
    | delete_h (n, x::xs) = ...   (* not there yet *) 

fun execute_ops [] xs = ...   (* no more operations to execute *) 
    | execute_ops (list_op::list_ops) xs = 
    let val new_xs = (case list_op of 
          insert (pos, elem) => insert_h (pos, elem, xs) 
         | delete pos   => delete_h (pos, xs) 
         | setsize size  => setsize_h (size, xs)) 
    in execute_ops list_ops new_xs 
    end 

您可能希望測試這些功能,無論是單獨或組合使用execute_ops

val test_insert_h_1 = insert_h (2, 7, [1,2,3,4]) = [1,2,7,4] 
val test_insert_h_2 = insert_h (9, 5, [1,2,3,4]) = [1,2,3,4,5] 

val test_setsize_h_1 = setsize_h (2, [5,6,7,8]) = [5,6] 
val test_setsize_h_2 = setsize_h (5, [1,2,3]) = [1,2,3,0,0] 

val test_delete_h_1 = delete_h (3, [4,5,6,7,8]) = [4,5,6,8] 
val test_delete_h_2 = delete_h (9, [1,2,3]) = [1,2,3] 

val test_execute_ops_1 = 
    execute_ops [insert (0, 5), insert (1, 6), insert (2, 7)] [2,3,5] = [5,6,7] 

val test_execute_ops_2 = 
    execute_ops [setsize 5, insert (4, 9)] [] = [0,0,0,0,9] 

val test_execute_ops_3 = 
    execute_ops [setsize 6, insert (1, 5), delete 3] [8,8,8,8,9] = [8,5,8,9,0] 
相關問題