ad-hoc 다형 함수와 파라 메트릭 다형 함수 사이를 변환하는 일반적인 방법이 있는지 궁금합니다. 다른 말로 표현하면, ad-hoc 다형 함수가 주어지면 매개 변수를 구현하는 방법은 무엇입니까? 그 반대의 경우는 어떨까요?ad-hoc 다형 함수와 파라 메트릭 다형 함수 사이를 변환하는 좋은 방법
예를 들어 sort
을 취하십시오. 그것은 sortBy
의 측면에서 sort :: Ord a => [a] -> [a]
쓰기 쉽다 :
sort :: Ord a => [a] -> [a]
sort = sortBy compare
하지만, 다른 방법은 주위에 내가 할 수있는 최선 조금 "객체 지향"이동하는 것입니다 지금까지, 까다로운 것 같다
import qualified Data.List as L
data OrdVal a = OV (a -> a -> Ordering) a
instance Eq (OrdVal a) where
(OV cmp a) == (OV _ b) = a `cmp` b == EQ
instance Ord (OrdVal a) where
(OV cmp a) `compare` (OV _ b) = a `cmp` b
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy cmp = map unOV . L.sort . map (OV cmp)
where
unOV (OV _ v) = v
을 그러나 이것은 적절한 해결책보다 해킹처럼 들립니다.
그래서 내가 알고 싶습니다 :이 특정 예를 들어 더 나은 방법
- 이 있습니까?
- ad-hoc 다형 함수와 파라 메트릭 함수를 변환하는 일반적인 기술은 무엇입니까?
사전을 전달할 수 있다면 (예 : Agda implicits와 같이) 사소한 일입니다. 그러나 일부 클래스/라이브러리는 일부 불변성을 보장하기 위해 사전을 전달할 수 없다는 사실을 악용합니다. 예를 들어 매번 다른 순서를 사용하여'Data.Set.insert'를 호출 할 수 있다고 상상해보십시오 ... – chi
실제로 "해킹"은 실제로 작동하지만, 두 개의 별개의'cmp' 함수를' OrdVal a 값. 그렇게하면,'Ord' 인스턴스는'Ord' 법칙을 만족시키지 못합니다. – chi