2012-01-03 27 views
5

Ok, có thể tiêu đề hơi khó hiểu, nhưng những gì tôi đang cố gắng có chức năng như sau: f (a:b:c:d:is) = ... nhưng có thể tham khảo a:b:c:d mà không cần viết lần nữa. Khi nó quay ra, tôi không thể làm một cái gì đó như [email protected](a:b:c:d):is và nhận được kết quả mong đợi. Ý tưởng nào?Sử dụng các mẫu không liên kết với Danh sách đầy đủ trong Haskell

+0

Bạn sẽ muốn sử dụng cú pháp thích hợp, e @ (a: b: c: d: là) – Sarah

+0

Oh tôi thấy những gì bạn đang nhận được. Nếu bạn đang sử dụng (e @ (a: b: c: d): là), thì đó là danh sách các danh sách có d là đuôi của các danh sách bên trong. Tôi không nghĩ rằng bạn có thể giúp điều này với các mẫu, vì các parens cho nhóm sẽ là cần thiết. – Sarah

Trả lời

6

Điều tốt nhất tôi có thể nghĩ đến là sử dụng view patterns, như thế này:

{-# LANGUAGE ViewPatterns #-} 
f (splitAt 4 -> ([email protected][a,b,c,d], is)) = is ++ [d,c,b,a] ++ as 
+0

+1, đó là điều tốt hơn tôi không thể nghĩ đến OTTOMH. –

+1

Bạn có thể tránh pragma ngôn ngữ bằng cách chỉ sử dụng bảo vệ mẫu. "f xs | (e @ [a, b, c, d], là) <- splitAt 4 xs = e" – Sarah

+0

Tôi đã hy vọng cho một cái gì đó là 'sạch' như mô hình, nhưng cảm ơn anyway. – byrondrossos

5

Bạn không thể làm điều đó, một lý do là a:b:c:d không phải là biểu thức được đánh máy tốt. Bởi các ràng buộc trong định nghĩa của f, a, b, c, d tất cả đều có cùng kiểu, nói t, nhưng các loại nhà xây dựng danh sách là

(:) :: t -> [t] -> [t] 

Bạn có thể sắp xếp-of đạt được những gì bạn muốn bằng cách gắn let foo = take 4 inputList. Phải thừa nhận là vụng về, nhưng tôi không thể nghĩ ra bất cứ điều gì tốt hơn khỏi đỉnh đầu của tôi.

+0

+1 để giải thích sự cố. –