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
Trả lời
Đ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
+1, đó là điều tốt hơn tôi không thể nghĩ đến OTTOMH. –
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
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
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.
+1 để giải thích sự cố. –
Bạn sẽ muốn sử dụng cú pháp thích hợp, e @ (a: b: c: d: là) – Sarah
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