2015-09-21 20 views
5

Để có bài tập cho lớp lập trình chức năng của tôi, tôi đang tập thể dục trên cây. Và cụ thể hơn trên cây hoa hồng. Trong khuôn khổ mà chúng ta có kiểu dữ liệu 'Rose' đã được định nghĩa, nhưng nó có một toán tử:>. Tôi đã tìm kiếm nó trên hoogle và nó nói rằng đó là phần tử ngoài cùng bên phải của một chuỗi và phần còn lại của chuỗi. (Một phần của khung bên dưới)Nhà điều hành Haskell Strange

data Rose a = a :> [Rose a] 
deriving (Eq, Show) 

-- Exercise 1 

root :: Rose a -> a 
root = undefined 

children :: Rose a -> [Rose a] 
children = undefined 

Tôi không có nghĩa là các bạn cần cho tôi biết cách thực hiện chức năng gốc và trẻ em. Nhưng nếu các bạn có thể cho tôi một số lời khuyên về cách đọc dòng 'dữ liệu Rose a' hoặc có thể chỉ cho tôi cách một cây hoa hồng sẽ được xây dựng như thế nào. Những điều này sẽ là một sự trợ giúp thực sự lớn khi tôi thích tập thể dục.

Tôi hy vọng ai đó có thể chỉ cho tôi đúng hướng.

Trả lời

9

t của rất giống với định nghĩa của một danh sách:

  • (:>) là một chút như (:)
  • data Rose a = a :> [Rose a] cho bạn, mà bạn có thể có được một t :: Rose a
    • với một yếu tố x :: a
    • và trẻ em rs :: [Rose a]
    • bởi t = x :> rs

tất nhiên bạn có thể lấy lại các yếu tố như thế này quá:

root (x :> rs) = ... 

tôi hy vọng bạn sẽ có được phần còn lại một mình;)

+1

Cảm ơn, trợ giúp thực sự lớn. Vâng, tôi có chức năng gốc và trẻ em. – mcNuggetsplays

9

Nhà điều hành :> là thực sự một nhà xây dựng dữ liệu. Nó sẽ tương đương với việc xác định loại là

data Rose a = Node a [Rose a] 

Nơi (:>) = Node. Vì vậy, với định nghĩa thay thế này, bạn sẽ có

root :: Rose a -> a 
root (Node a subnodes) = a 

Thay cho các nhà xây dựng thực tế :> bạn sẽ phải

root ((:>) a subnodes) = a 

nào cũng có thể được viết như

root (a :> subnodes) = a 

Như @Carsten nói nó chỉ là giống như hàm tạo danh sách :, chỉ dành cho kiểu dữ liệu Rose.

6

Toán tử :> không có ý nghĩa xác định trước. Đó là được giới thiệu bởi định nghĩa Rose của bạn, giống như số nhận dạng Rose. Trong Haskell bạn có thể xác định các toán tử của riêng bạn, đây là một trong số chúng.

Toán tử cụ thể này là một hàm tạo dữ liệu, có thể được xác định bởi ký tự đầu tiên. Các nhà xây dựng dữ liệu bắt đầu bằng dấu hai chấm. Các toán tử không bắt đầu bằng dấu hai chấm là các hàm bình thường.

Nó hoạt động giống như bất kỳ hàm tạo dữ liệu khác, khác biệt duy nhất là nó được viết dưới dạng infix, như :. Trong chương trình này, nó có thể được đọc là "gắn liền với".

Vì mọi người đều có thể sử dụng nó trong chương trình của riêng họ cho bất kỳ mục đích nào, nên vô ích đối với google.