2015-05-19 38 views
7

Tôi đã thử googling nhưng đi lên ngắn. Tôi đang nâng cao kiến ​​thức Haskell của mình bằng cách đọc một số bài báo và tôi bắt gặp một bài viết sử dụng cú pháp mà tôi chưa bao giờ thấy trước đây. Ví dụ sẽ là:'@' có nghĩa là gì trong Haskell?

reconstruct [email protected](Node a b c l r) [email protected](Node b d le ri) 

Tôi chưa bao giờ thấy những @ này trước đây. Tôi đã cố gắng tìm kiếm trực tuyến cho một câu trả lời nhưng đã đưa ra ngắn. Đây có phải chỉ đơn giản là cách để nhúng thẻ để giúp mọi thứ rõ ràng hơn hoặc chúng có tác động thực sự đến mã không?

+0

Tìm kiếm "làm mẫu" trong http://learnyouahaskell.com/syntax-in-functions#pattern-matching để giới thiệu. – Jubobs

+7

Trong khi các công cụ tìm kiếm truyền thống sẽ không trả lại kết quả hữu ích khi tìm kiếm các ký tự đặc biệt, Haskell của riêng [hoogle thường khá hữu ích] (https://www.haskell.org/hoogle/?hoogle=%40) cho các câu hỏi như vậy. – ComicSansMS

+0

@ComicSansMS hữu ích hơn sau đó câu trả lời! –

Trả lời

13

Nó được sử dụng trong kết hợp mẫu. Hiện tại, biến số node sẽ tham chiếu đến toàn bộ loại dữ liệu Node cho đối số Node a b c l r. Vì vậy, thay vì chuyển đến hàm là Node a b c l r, bạn có thể sử dụng node để thay thế.

Một ví dụ đơn giản hơn nhiều để chứng minh điều đó:

data SomeType = Leaf Int Int Int | Nil deriving Show 

someFunction :: SomeType -> SomeType 
someFunction [email protected](Leaf _ _ _) = leaf 
someFunction Nil = Leaf 0 0 0 

Các someFunction cũng có thể được viết như sau:

someFunction :: SomeType -> SomeType 
someFunction (Leaf x y z) = Leaf x y z 
someFunction Nil = Leaf 0 0 0 

Xem cách đơn giản hơn là phiên bản đầu tiên?

+0

Thậm chí đơn giản hơn sẽ là 'someFunction leaf @ Leaf {} = leaf'. –

+2

@ AndrásKovács, nhưng nó không đòi hỏi một số giải thích về 'Leaf {}'? – d12frosted

+0

Được rồi, giờ tôi đã hiểu hoàn toàn. Cảm ơn! :-) – Rewbert

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