gen :: Int -> [Foo]
이라는 소유주 인 Foo
클래스가 있습니다. 이 전 기능 bar :: Bar -> IO()
를 정의 Bar
라는 또 다른 클래스를 상상하자, 이제클래스를 다른 클래스의 인스턴스로 만들기
data FooTest = FooTest Int
instance Foo FooTest where
gen n = replicate n (FooTest 0)
: 예를 들어, 나는 Foo
의 그런 식으로 인스턴스를 만들 수 있습니다. Foo
의 각 인스턴스는 Bar
, 이지만Bar
구현은 각 인스턴스에 대해 완전히 동일해야합니다. 다음은 예입니다 :
class Foo f where
gen :: Int -> [f]
class Bar b where
bar :: b -> IO()
instance Bar Foo where -- obviously that doesn’t work
bar _ = putStrLn "bar through any Foo instance"
instance (Foo f) => Bar f where -- this needs the FlexibleInstance GHC extension first, then it still throws shit saying that the constraint is not smaller that I don’t shit
bar _ = putStrLn "bar through any Foo instance"
여기서 문제는 첫 번째 클래스의 인스턴스가 다른 인스턴스화 동일한 구현을 공유 할 수 있다는 사실을 언급 다른 인스턴스를 클래스를 만들 수있는 방법을 찾을 수 없다 수업.
아이디어가 있으십니까?
미리 감사드립니다.
감사합니다. 필자가 아는 한, FlexibleInstance는 무엇을위한 것인가? 두 개의 확장이 쌍으로 작동합니까? – phaazon
모든 컨텍스트에서 일관되게 괄호를 씁니다. 따라서 형식 시그니처 및 클래스/인스턴스 헤드를보다 쉽게 읽을 수 있습니다. 그래서 나는 당신의 스타일 노트에 동의하지 않습니다. – ertes
FlexibleInstaces 관련 :이 QA도 참조하십시오. http://stackoverflow.com/questions/8367423/are-haskell-flexibleinstances-a-stable-extension-to-the-language – scravy