2011-11-04 18 views
5

Tôi có đoạn code sau:SML - biến cởi ra hoặc constructor

datatype expr = K of string| Number2 of expr * (expr list); 
datatype number = Number1 of string | Number3 of int; 
fun append (nil, l2) = l2 
    | append (x::xs, l2) = x::append(xs, l2); 
fun map [] = [] 
    | map (h::t) = (What h)::(map t); 
fun What (K x) = [Number1(x)] 
    |What (Number2 (t,[])) = Number3(0)::What(t) 
    |What (Number2 (y,a::b)) = append(What(a), map(b)); 

Nó không công nhận chức năng "gì" (biến cởi ra hoặc constructor).. Làm thế nào tôi có thể sửa chữa nó, rằng nó sẽ biết chức năng "Cái gì"?

Cảm ơn.

Trả lời

7

Tuyên bố trong SML hoạt động từ trên xuống dưới, vì vậy map không thấy What. Việc chuyển đổi đơn đặt hàng sẽ không hữu ích, khi đó What sẽ không thấy map, đưa ra cùng một lỗi. Thay vào đó, bạn cần phải khai báo các chức năng hai bên đệ quy đồng thời sử dụng and:

fun map [] = [] 
    | map (h::t) = (What h)::(map t) 
and What (K x) = [Number1(x)] 
    | What (Number2 (t,[])) = Number3(0)::What(t) 
    | What (Number2 (y,a::b)) = append(What(a), map(b)) 
3

Bạn phải sử dụng and cho đệ quy lẫn nhau. Bạn có một số vấn đề khác mặc dù trong mã của bạn. What rõ ràng là expr -> number list, có nghĩa là map phải là expr list -> (number list) list, vì vậy trong dòng cuối cùng bạn đang cố gắng nối thêm number list list vào number list. Nó không phải là ở tất cả rõ ràng những gì mã có nghĩa là để làm mặc dù, vì vậy bạn có thể phải làm việc ra logic của bạn dự định của riêng bạn. Không có cách nào rõ ràng để viết một hàm với kiểu được yêu cầu.

+0

Cảm ơn bạn Nicholas, tôi chỉ đối phó với điều này và tôi ngăn xếp. "b" có thể là danh sách expr. Tôi chỉ muốn kiểm tra từng expr trong danh sách đó và quyết định nếu nó "Number1" hoặc "Number3" hoặc loại dữ liệu expr - tất cả điều này tôi làm theo chức năng gì. Ý tưởng duy nhất là sử dụng "bản đồ" để kiểm tra từng thành viên trong danh sách. Nhưng nó đưa ra một lỗi: "toán hạng và toán tử không đồng ý". Bất kỳ ý tưởng? –

+2

Các loại của bạn rất bối rối. Thứ nhất, có: b chắc chắn là một danh sách của expr. Tất cả đều là exprs: không có Number1 hoặc Number3s trong b. Bạn sẽ phải giải thích cho chúng tôi những gì bạn đang cố gắng làm, bởi vì tôi không nghĩ rằng chúng tôi có cơ hội giúp bạn nếu không. Bạn có nhận ra rằng chức năng bản đồ của bạn rất khác với bản đồ bình thường? Có lẽ đó là sự nhầm lẫn. Bạn cũng bỏ qua y; là expr có nghĩa là để được sử dụng cho một cái gì đó? –

+1

Tại sao chức năng của tôi lại khác với bản đồ bình thường? Tôi sẽ làm rõ câu hỏi của tôi: Số 2 là expr và có thể là danh sách expr. Bây giờ, Nếu nó là một danh sách của expr, Vì vậy, tôi muốn kiểm tra mỗi thành viên trong danh sách đó, và để tìm hiểu xem nó K hoặc Number2. Sau đó, tôi cần phải quyết định làm gì với thành viên này (Nó có thể là Number1 hoặc Number3, hai dòng đầu tiên của tôi trong hàm What), và tạo một danh sách chỉ chứa Number1 hoặc Number3. vì vậy, cách trực quan của tôi là sử dụng bản đồ để kiểm tra từng thành viên trong "b", gỡ bỏ phần cuối của danh sách, bằng cách sử dụng chức năng bản đồ. Cảm ơn bạn. –

Các vấn đề liên quan