Tôi đã cố gắng để xác định chức năng này để tập hợp lại ba danh sách các cặp:RankNTypes: áp dụng các chức năng tương tự cho các cặp của các loại khác nhau
{-# LANGUAGE RankNTypes #-}
mapAndZip3 :: (forall x. x -> f x) -> [a] -> [b] -> [c]
-> [(f a, f b, f c)]
mapAndZip3 f la lb lc = zipWith3 (\a b c -> (f a, f b, f c)) la lb lc
main = do
let x = mapAndZip3 (fst) [(1,"fruit"), (2,"martini")]
[("chips","fish"),("rice","steak")]
[(5,"cake"),(4,"pudding")]
print x -- was expecting [(1,"chips",5), (2,"rice",4)]
Lúc đầu, tôi đã không bao gồm các RankNTypes
hoặc forall
, nhưng sau đó sau khi chụp this, cụ thể là định nghĩa liftTup
, tôi nghĩ rằng điều đó là đủ.
Nhưng rõ ràng, đó không phải là, như tôi vẫn nhận được một lỗi:
mapAndZip3.hs:8:25:
Couldn't match type `x' with `(f0 x, b0)'
`x' is a rigid type variable bound by
a type expected by the context: x -> f0 x at mapAndZip3.hs:8:13
Expected type: x -> f0 x
Actual type: (f0 x, b0) -> f0 x
In the first argument of `mapAndZip3', namely `(fst)'
tôi rõ ràng có một sự hiểu biết hạn chế về từ khóa forall
, nhưng từ những gì tôi hiểu nó nên, trong trường hợp này, cho phép cho f
để chấp nhận bất kỳ loại nào. Những gì tôi không hiểu là: một lần trong một bối cảnh nhất định, và được sử dụng một lần, định nghĩa có được 'cố định' cho bối cảnh còn lại không? Nó không có vẻ như vậy, bởi vì nếu tôi thay thế "chip" và "gạo" với Ints, trình biên dịch vẫn phàn nàn, vì vậy tôi đoán tôi giả định một cái gì đó sai (tất nhiên, nếu tôi loại bỏ chú thích kiểu của mapAndZip3
trong trường hợp sau này, mọi thứ hoạt động vì chữ ký được đơn giản hóa thành mapAndZip3 :: (a -> t) -> [a] -> [a] -> [a] -> [(t, t, t)]
, nhưng đây không phải là điều tôi muốn).
Tôi cũng thấy question này, nhưng thực sự không thể làm nếu điều này là cùng một vấn đề hay không, kể từ khi chức năng tôi đang cố gắng áp dụng không phải là id
, nhưng fst
hoặc snd
, chức năng mà thực sự trở lại các loại khác nhau (a -> b)
.
Cảm ơn! Tôi đã có một thời gian thực sự khó khăn để chọn một câu trả lời chính xác, vì cả hai thực sự giải thích điều này là không thể. Và tôi rất giống Daniel Fischer, câu trả lời là câu hỏi dễ hiểu nhất lúc đầu, câu trả lời còn sót lại đã cho tôi thêm một số ngữ cảnh. Chúc mừng cho cả hai! – jcristovao