Chữ ký loại của bạn sẽ không hoạt động. Bạn cần có khả năng cung cấp cho hàm được truyền một danh sách các bộ dữ liệu, có nghĩa là bạn phải sử dụng các loại xếp hạng cao hơn để buộc nó phải được đa hình hoặc đề cập rõ ràng các bộ dữ liệu trong chữ ký loại của bạn.
Nếu không có điều này, bạn không thể "nhìn vào bên trong" hàm để xem cách sắp xếp lại các yếu tố trong danh sách. Trong thực tế, với chữ ký kiểu của bạn, hàm được truyền có thể làm bất cứ điều gì nó muốn trong danh sách, bao gồm chèn các phần tử thậm chí không có trong đó để bắt đầu!
Đây là những gì tôi đã làm việc sử dụng các loại-rank cao hơn:
{-# LANGUAGE RankNTypes #-}
import Data.List (sortBy)
import Data.Ord (comparing)
indexesOf :: (forall b. (b -> a) -> [b] -> [b]) -> [a] -> [Int]
indexesOf f xs = map snd $ f fst $ zip xs [0..]
foo :: (Ord a, Num a) => [a] -> [Int]
foo = indexesOf (filter . ((< 10) .))
bar :: Ord a => [a] -> [Int]
bar = indexesOf (sortBy . comparing)
Lưu ý rằng tôi cũng đã có thêm một đối số bổ sung cho các chức năng thông qua nói với nó như thế nào để trích xuất các phần nó quan tâm đến từ các yếu tố của danh sách mà nó đang hoạt động. Nếu không có điều này, bạn sẽ chỉ có thể sử dụng các chức năng không kiểm tra các phần tử của danh sách, chẳng hạn như reverse
và điều đó sẽ không hữu ích lắm.
Ví dụ chạy trong GHCi:
> let xs = [42, 0, 7, 3, 12, 17, 99, 36, 8]
> foo xs
[1,2,3,8]
> bar xs
[1,3,2,8,4,5,7,0,6]
> indexesOf (const reverse) xs
[8,7,6,5,4,3,2,1,0]
... Tôi thực sự không rõ ràng những gì bạn đang cố gắng làm. –
Tôi có một hàm hoạt động trên danh sách, nói 'sắp xếp'. Bây giờ thay vì danh sách được sắp xếp, tôi muốn lấy lại các chỉ mục * của các phần tử. Ví dụ. cho '[5.0, 8.0, 7.0]' Tôi không muốn '[5.0. 7,0, 8,0] 'nhưng' [0,2,1] '. – Landei