Tôi cảm thấy có gì đó không thoải mái với cú pháp bản ghi Haskell


9

Hầu hết các cú pháp Haskell có vẻ đẹp của sự tinh khiết. Nhưng cú pháp bản ghi trông xấu xí. Nó không thoải mái. Nó cảm thấy một số loại hỗn hợp với C. Nó đòi hỏi dấu phẩy và dấu ngoặc nhọn. Haskell có tab, phân tách dựa trên dòng. Vì vậy, nó trông quá dài dòng so với ban đầu nó yêu cầu. Tại sao nó được thiết kế theo cách đó?


4
Đối với tôi tất cả Haskell cảm thấy kỳ lạ. Tôi có thể làm gì?
Công việc

7
Bạn không cô đơn. Khá nhiều người phàn nàn về (hiện thân của) hồ sơ.

Eonil: Nếu bạn thực sự ghét cú pháp bản ghi, bạn có thể vô hiệu hóa nó với phần mở rộng {- # NoTraditableRecordSyntax # -} GHC.
Daniel Díaz Car rời

Câu trả lời:


8

Mặc dù tôi không tham gia vào thiết kế, tôi nghĩ rằng cú pháp bản ghi được định hình là phù hợp với cú pháp danh sách. Cú pháp xuất mô-đun cũng sử dụng dấu phẩy, nơi thực sự duy nhất sử dụng bố cục là khai báo cấp cao nhất, trong đó các mệnh đề và ký hiệu.

Trên hết, được đưa ra

data Foo = Foo {bar :: Int, baz :: Int}

viết

fnord x = x { bar = 4 }

không có dấu ngoặc nhọn sẽ xung đột với phần còn lại của cú pháp và sử dụng bố cục, như

fnord x = x
    bar = 4

sẽ làm cho cú pháp khá giòn. Thêm một "nơi" ở sai vị trí và mã của bạn có nghĩa là một cái gì đó hoàn toàn khác nhau.

Nếu bạn không hài lòng với trạng thái của các bản ghi trong Haskell (và bạn sẽ không đơn độc với điều đó), tôi khuyên bạn nên xem fclabels hoặc thậm chí là các bản hack typeclass phức tạp như HList hoặc bưởi-hồ sơ (hai bản sau không được cho người yếu tim, nhưng cũng cực kỳ mạnh mẽ)

fclabels sẽ cho phép bạn viết (yay pointfree)

fnord = setL bar 4

cũng như

getBar = getL bar

trên đầu trang của nó thực sự là nhà tù, đó là sáng tác nhãn:

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

Hừm. Có setLnghĩa là đột biến ?? Nếu không có IO? Thật khó hiểu ...
Eonil

2
Hoàn toàn không, bạn sẽ nhận được một bản sao (chia sẻ) khác của bản ghi với một trường duy nhất được thay đổi, giống như với cú pháp bản ghi. Không có tính đột biến hoặc phá vỡ tính minh bạch tham chiếu liên quan.
barsoap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.