2010-05-06 48 views
5

Tôi muốn biểu diễn biểu đồ trong Haskell theo cách sau:Biểu đồ kiểu dữ liệu biểu đồ Haskell

Đối với mỗi nút, tôi muốn lưu giá trị của nó và danh sách các nút lân cận. Vấn đề mà tôi gặp khó khăn là tôi muốn các nút liền kề được lưu trữ như là các tham chiếu đến các nút khác.

Ví dụ, tôi muốn lưu trữ nút ny („NY“ (l p)) trong đó l và p là các nút lân cận chứ không phải („NY“ („London“ „Paris“)).
tôi đã cố gắng một cái gì đó như thế này:

data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        }deriving (Show) 

let n1 = Node {value=1, neighbors=[n2]} 
let n2 = Node {value=1, neighbors=[n1 n3]} 
let n3 = Node {value=1, neighbors=[n2]} 

Nhưng tôi nhận được en lỗi trong let. Tôi đang làm gì sai?

+1

Bạn có lẽ dùng để sử dụng ' let' tại dấu nhắc ghci, nhưng nó không cần thiết ở cấp cao nhất trong các chương trình haskell thực tế. –

Trả lời

7

Hai vấn đề:

  1. let là một hình thức biểu hiện và ở cấp cao nhất trình biên dịch được mong đợi một tờ khai.

  2. Bạn cần tổ hợp các ràng buộc; bằng cách sử dụng ba let s, bạn đã chia các định nghĩa thành ba phạm vi riêng biệt.

Các mã sau biên dịch, và khi tôi yêu cầu n1, tôi nhận được một chuỗi in vô hạn như mong đợi:

module Letnest 
where 
data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        } deriving (Show) 

n1 = Node {value=1, neighbors=[n2]} 
n2 = Node {value=1, neighbors=[n1, n3]} 
n3 = Node {value=1, neighbors=[n2]} 
+3

Lưu ý rằng 'n1' và' n3' hoàn toàn không thể phân biệt được (vì chúng có cùng định nghĩa), tùy thuộc vào ứng dụng của bạn, có thể là một vấn đề với biểu diễn này. –

4

tôi sẽ không đại diện cho một biểu đồ theo cách này. Lưu trữ các nút trong một Bản đồ hoặc một mảng và tham chiếu chúng bằng các phím của chúng thay vì trực tiếp trỏ đến chúng. Điều này sẽ dễ dàng hơn để lưu, tải, duy trì và làm việc.

Đối với một số vấn đề với đại diện hiện tại của bạn:

Reid Barton nhận xét:

Lưu ý rằng n1 và n3 là hoàn toàn không thể phân biệt (kể từ khi họ có nét giống nhau) mà, tùy thuộc vào ứng dụng của bạn, có thể là một vấn đề với đại diện này.

(không có is so a la Python trong Haskell)

Norman Ramsey nhận thấy:

tôi nhận được một chuỗi in vô hạn

+1

Tôi cũng không đại diện cho một đồ thị như thế này nhưng đó là những gì bài tập về nhà của tôi nói :) –

+0

@ John Retallack: oh. Tôi hy vọng rằng câu hỏi bài tập về nhà tiếp theo là về cách khác bạn có thể đại diện cho một biểu đồ. – yairchu

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