Tôi phải viết một hàm làm phẳng danh sách danh sách.Làm phẳng danh sách các danh sách
Ví dụ flatten [] = []
hoặc flatten [1,2,3,4] = [1,2,3,4]
hoặc flatten [[1,2],[3],4,5]] = [1,2,3,4,5]
Tôi đang gặp rắc rối với việc có thể để phù hợp với loại phụ thuộc vào những gì được trao cho các chức năng flatten.
Dưới đây là những gì tôi có:
data A a = B a | C [a] deriving (Show, Eq, Ord)
flatten::(Show a, Eq a, Ord a)=>A a -> A a
flatten (C []) = (C [])
flatten (C (x:xs)) = (C flatten x) ++ (C flatten xs)
flatten (B a) = (C [a])
Từ những gì tôi có thể nói vấn đề là các nhà điều hành ++
đang mong đợi một danh sách cho cả hai đối số của nó và tôi đang cố gắng để cung cấp cho nó một cái gì đó kiểu A
. Tôi đã thêm loại A
để chức năng có thể lấy một phần tử đơn lẻ hoặc danh sách các phần tử.
Có ai biết cách khác để thực hiện việc này khác hay giải thích những gì tôi có thể làm để khắc phục lỗi loại?
Tôi không chắc chắn chính xác những gì bạn muốn. Có lẽ 'flatten :: A [a] -> A a; flatten (B xs) = C xs; flatten (C xss) = C (concat xss) 'sẽ giúp bạn?Về cơ bản, bạn không thể viết flatten để nó có danh sách các tổ khác nhau và làm những việc khác nhau với chúng, trừ khi bạn bọc chúng thành một kiểu mới và phân biệt các trường hợp với hàm tạo. –
Loại hàm của bạn phải là '[[a]] -> [a]'. Điều này có nghĩa là 'flatten []' là hợp lệ, và 'flatten [[1,2,3,4]]' là hợp lệ, nhưng 'flatten [1,2,3,4]' thì không. '[1,2,3,4]' không phải là danh sách các danh sách. Nếu bạn nghĩ về điều đó và bắt đầu từ đầu, loại bỏ loại đặc biệt của bạn, bạn sẽ thấy nó dễ dàng hơn nhiều. –
có thể trùng lặp với [thao tác trên danh sách danh sách | cách] (http://stackoverflow.com/questions/9477806/operation-on-list-of-lists-how) – rampion