Gần đây tôi đã gặp phải tình huống cần chuyển một hàm vị ngữ sang một hàm khác và thông thường logic tôi đang tìm kiếm về cơ bản là "giá trị này có khớp với mẫu này không?"
Kết hợp mẫu dường như được ưa thích trong khai báo, do
khối và hiểu danh sách, nhưng có một số hàm lấy một vị ngữ a -> Bool
, trong đó sẽ rất thuận tiện để bằng cách nào đó chuyển qua một mẫu. Ví dụ, takeWhile
, until
, find
, span
,, vv
Cho đến nay tôi đã làm \a -> case a of MyCons _ -> True; otherwise -> False
, hoặc viết một chức năng được đặt tên là la let myPred (MyCons _) = True; myPred _ = False in
nhưng cả hai đều có vẻ xấu xí và không thành ngữ lắm. Cách "rõ ràng" (và sai) sẽ giống như thế \(MyCons _) -> True
nhưng điều đó gây ra lỗi vì là một phần, một cách tự nhiên, và thậm chí sau đó cảm giác như phải có một cách sạch hơn.
Có cách nào gọn gàng / sạch sẽ hơn để làm điều này không? Hay tôi đang đi về những thứ hoàn toàn sai lầm?
let myPred...
phong cách đó là xấu , nhưng nó cảm thấy dài dòng hơn tôi mong đợi cho một ý tưởng rất đơn giản, khiến tôi tự hỏi nếu tôi đang sủa sai cây.
maybe :: b -> (a -> b) -> Maybe a -> b
và bool :: a -> a -> Bool -> a
sau đó sử dụng nó với (các) hàm tạo Boolean làm đối số. ví dụ myCons z f (MyCons x) = f x ; myCons z f _ = z
, sau đó gọi myCons False (const True) aMyConsValue
. đây gần như là những gì bạn đã viết, chỉ cần có thêm một mức độ "gián tiếp" / "trừu tượng" thông qua (các) đối số chức năng, được đưa vào trong đó.
let
mệnh đề mà bạn không thích - mặc dù tôi thíchwhere
mệnh đề tương đương nên điều này không làm lộn xộn định nghĩa chính. Tất nhiên nếu cuối cùng bạn cần tiện ích này nhiều lần thì bạn sẽ xác định nó là một chức năng cấp cao nhất.