9

Nếu tôi có một Haskell ADT như:Tên ADT. `Trái a` là gì, và sau đó cái gì là` a`, trong Haskell?

data Foo 
= A Int Double 
| B Bool [Integer] 
| C (Maybe String) Float 

các A, B, và C được gọi là nhà xây dựng dữ liệu; và đôi khi là nhà thầu giá trị. Nhưng tên chính xác cho:

  1. "hàng/thay thế": ví dụ: B Bool [Integer]; và
  2. "trường/phần tử" của "hàng/thay thế": ví dụ: số Double trong A hoặc số [Integer] trong B?
+1

Tôi nghĩ rằng bạn muốn mô tả 'B: Bool -> [Integer] -> Foo' như các nhà xây dựng và kiểu của nó. 'Bool' và' [Integer] 'sẽ là đối số của nó và ví dụ: '[Số nguyên]' sẽ là một tham số hoặc đối số duy nhất. Nhưng tôi không chắc chắn nếu đây là những tên được chấp nhận chung. – nobody

+0

Từ những gì tôi đã thấy, "các trường" là thuật ngữ chính xác. "Tham số" hoặc "đối số" chỉ được sử dụng khi thực sự * xây dựng *. – Nate

+0

Tôi đoán tôi thường không cảm thấy cần phải đề cập đến những điều đó. Nó thường là đủ để chỉ đến "constructor C" hoặc "loại Foo". Bạn có một ví dụ điền vào câu trống mà bạn muốn đề cập đến những điều này? (Có lẽ những người trả lời sẽ chấp nhận thử thách khi sử dụng những thuật ngữ này một cách có ý nghĩa trong một câu.) –

Trả lời

3
data Foo = A Int Double 
    ^^ Type Constructor "data Foo" 
     ^value Constructor "A" 
      ^^ Component "Int" and "Double" 

A | B thường được gọi là lựa chọn thay thế hoặc các trường hợp. Xin lỗi vì sơ đồ crappy.

Source: Real World Haskell ch3

+0

Báo cáo Haskell cũng sử dụng "thành phần", có vẻ phù hợp cho quý 2. Tôi cũng thấy "định nghĩa constructor" ở đó, có vẻ như đúng cho Q1. – user2023370

11

Reading Phần 4.2 từ Báo cáo Haskell98 (http://www.haskell.org/onlinereport/decls.html):

  1. này không được nêu ra một cách rõ ràng, nhưng B Bool [Integer] có lẽ là một cách chính xác nhất gọi là "khai báo constructor" (đối với các nhà xây dựng gọi là B)
  2. Những thứ như Double trong A được gọi là khai báo trường (mặc dù chỉ đơn giản gọi đó là trường cũng phải OK).
+0

Cảm ơn Sumudu. Nhìn vào đó, tôi chỉ có thể thấy "định nghĩa hàm tạo", và nó giống nhau trong [báo cáo Haskell 2010 - Phần 4.2] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-680004.2). Đối với "trường", có vẻ như đó là * chỉ * được sử dụng khi thảo luận cú pháp bản ghi cụ thể; và có "trường có nhãn" hoặc "nhãn trường". "Thành phần" được sử dụng trên cùng một trang và tôi nghĩ nó có thể đúng. – user2023370

+0

Đủ công bằng. Tôi đã ngoại suy "khai báo trường" từ tên được sử dụng trong thông số cú pháp là "fielddecl". Có vẻ như không phải là một tên hoàn toàn dứt khoát (IMO khi họ sử dụng "thành phần" đó là nhiều hơn một mô tả hơn là thực sự đặt tên nó). –

+0

Tôi đồng ý, nó giống như mô tả. Nhân tiện, "fielddecl" trong thông số cú pháp cũng chỉ đề cập đến cú pháp bản ghi. – user2023370

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