나는 HList
라이브러리의 코드를 읽습니다. HBetween
클래스는 HNat
을 취하고 범위를 형성하는 HNat
의 목록을 반환하는 유형 수준 함수입니다 [HZero, n). 다른 클래스 HRange
을 구현하고 싶습니다. 오버로드 함수 hRange :: l -> u -> r
이 있는데, 이는 낮은 경계 인 l
과 상한 인 u
을 사용하고 [l, u] 범위를 반환합니다. 내 코드는 아래 (코드가 더 명확하게하는 것입니다, hRange
의 결과가 반대 순서에, (유, L])haskell의 중복 인스턴스
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
FlexibleInstances, FlexibleContexts, UndecidableInstances #-}
module Data.HList.HNats where
import Data.HList.CommonMain
class (HNat l, HNat u) => HRange l u r | l u -> r where
hRange :: l -> u -> r
instance HNat l => HRange l (HSucc l) (HCons l HNil) where
hRange _ _ = undefined
instance HRange l u r => HRange l (HSucc u) (HCons u r) where
hRange _ _ = undefined
내가 ghci에서이 코드를 시도, 예상치 못한 일이 말 :
*Data.HList.HNats Data.HList> :load Data/HList/HNats
[1 of 1] Compiling Data.HList.HNats (Data/HList/HNats.hs, interpreted)
Ok, modules loaded: Data.HList.HNats.
*Data.HList.HNats Data.HList> hRange hZero (hSucc hZero)
<interactive>:24:1:
Overlapping instances for HRange
HZero (HSucc HZero) (HCons HZero HNil)
arising from a use of `hRange'
Matching instances:
instance HNat l => HRange l (HSucc l) (HCons l HNil)
-- Defined at Data/HList/HNats.hs:14:10
instance HRange l u r => HRange l (HSucc u) (HCons u r)
-- Defined at Data/HList/HNats.hs:20:10
In the expression: hRange hZero (hSucc hZero)
In an equation for `it': it = hRange hZero (hSucc hZero)
*Data.HList.HNats Data.HList>
hRange hZero (hSucc hZero)
예를
instance HRange l u r => HRange l (HSucc u) (HCons u r)
일치 수없는 이유
나도 몰라. 어떤 설명이 감사합니다! GHC는 HRange HZero (HSucc HZero) (HCons Zero HNil)
로 hRange hZero (hSucc hZero)
의 유형을 준다
대단히 감사합니다. 나는 다른 방법을 찾고 있습니다. :) – pysuxing