Tôi có một chức năng tạo ra đệ quy một danh sách các ma trận phẳng từ một cây phải có thể thay đổi được vì các phần tử của chúng được cập nhật thường xuyên trong quá trình tạo. Cho đến nay tôi đã đưa ra một giải pháp đệ quy mà có chữ ký:map runSTArray trong danh sách STArrays?
doAll :: .. -> [ST s (STArray s (Int, Int) Int)]
Lý do tôi không trả lại [UArray (Int,Int) Int]
trực tiếp được vì doAll
được gọi là đệ quy, sửa đổi các yếu tố của các ma trận trong danh sách và gắn thêm ma trận mới . Tôi không muốn đóng băng và làm tan các ma trận một cách không cần thiết.
Cho đến nay rất tốt. Tôi có thể kiểm tra việc n
ma trận -thứ (loại Array (Int, Int) Int
) trong ghci
runSTArray (matrices !! 0)
runSTArray (matrices !! 1)
và thực sự tôi nhận được kết quả chính xác cho thuật toán của tôi. Tuy nhiên, tôi không tìm thấy một cách để lập bản đồ runSTUArray
qua danh sách được trả về bởi doAll
:
map (runSTArray) matrices
Couldn't match expected type `forall s. ST s (STArray s i0 e0)'
with actual type `ST s0 (STArray s0 (Int, Int) Int)'
Vấn đề tương tự sẽ xảy ra nếu tôi cố gắng để đánh giá một cách đệ quy trên danh sách hoặc thử để đánh giá các yếu tố đơn lẻ bọc trong một chức năng
Ai đó có thể giải thích điều gì đang diễn ra (tôi thực sự không hiểu ý nghĩa của từ khóa forall
) và cách tôi có thể đánh giá các mảng trong danh sách?
http://www.mail-archive.com/[email protected]/msg47957.html –