문제

Haskell98에서 약간의 추상화를 시도하고 있지만 어떻게 해야할지 모르겠습니다.

내가하고 싶은 것은 목록으로 변환 될 수있는 유형의 클래스를 정의하는 것입니다.

toList :: a -> [b]

그러나이 방법에 대한 클래스를 정의하는 방법을 모르겠습니다. 다음 세 가지 아이디어를 제기했습니다.

class ToList a b where
    toList :: a -> [b]

class ToList a where
    toList :: a -> [b]

class ToList a where
    toList :: a b -> [b]

Haskell98이 여러 매개 변수 클래스를 허용하지 않기 때문에 첫 번째는 작동하지 않습니다.

두 번째는 B가 A에 의존하고 모든 b에 대해 구현할 수 없기 때문에 작동하지 않습니다.

'b'가 마지막 유형 패러 아미터가 아닌 유형으로 클래스를 주입하는 방법을 모르기 때문에 세 번째는 작동하지 않습니다.

data HTree a b = Nil | Node a b (HTree a b) (HTree a b)

toList Nil = []
toList Node x y l r = toList l ++ [(x,y)] ++ toList r

또는

toList Nil = []
toList Node x y l r = toList l ++ [x] ++ toList r

어떻게 그런 일을하겠습니까?

도움이 되었습니까?

해결책

또한보십시오 데이터 표준 라이브러리에서 toList 어떤 기능 Foldable 사례. Foldable 인스턴스팅을 위해 약간의 정교함이 필요하지만 좋은 연습이 될 것입니다. 보너스로, 당신의 HTree 유형은 문서의 예제 인스턴스와 거의 동일합니다.

또한 변경하는 것이 좋습니다 HTree 에게:

data HTree a = Nil | Node a (HTree a) (HTree a)

그리고 사용합니다 HTree (a,b) 대신에 HTree a b. 이 단일 파라미터 버전은 표준 유형 및 인스턴스와 함께 더 쉽게 복합 가능하며, 동일한 방식으로 두 매개 변수에 의존하기 때문에 진행중인 작업에 더 많은 정보를 얻을 수 있습니다. 그것은 또한 a Functor, 그리고 그러한 인스턴스를 정의하면이 유형이 작업하기에 정말 좋을 것입니다.

다른 팁

추천합니다 유형 클래스는 처음 보이는 것만 큼 유용하지 않습니다. - 추정 클래스에 하나의 인터페이스 메소드가있는 경우 대신 함수 유형을 선언하는 것을 고려하십시오. 나도 OO 배경에서 나왔고 "클래스"가 실제로 "데이터"를 사용해야했을 때의 의미를 의미하는 "클래스"를 만들려고 너무 많은 시간을 보냈다는 것을 알았습니다.

Tolist '기능을 작성한 다음 데이터 구조에서 작동하도록'리프트 '하는 것이 훨씬 쉽습니다. 사실, 호평을 받았습니다 또 다른 Haskell 튜토리얼 그것이 어떻게 수행되는지 보여주는 광범위한 운동을 겪고 이진 트리를 예로 사용합니다. 리프트를 수행하는 데있어 가장 큰 장점은 중요한 것을 구별한다는 것입니다 - Tolist의 구현이 아닌 데이터 유형의 구조 ' -'데이터 유형의 순서대로 '리프트가 수행되면 리프트를 사용할 수 있습니다. 무엇이든 할 수 있습니다 - Tolist, Print, 무엇이든. Tolist를 지원하는 것은 데이터 구조의 중요한 부분이 아니므로 클래스 선언에있어서는 안됩니다. 중요한 부분은 데이터 구조를 가로 지르는 방법입니다.

클래스 Tolist의 마지막 옵션을 선택하고 만들고 싶을 것입니다. (HTree a) Tolist의 사례. 그 다음에 toList 유형이 있습니다(HTree a b) -> [b], 예를 들어 (HTree a b) -> [(a,b)]. 나는 당신이 A를 "키"로 생각하고 B를 "값"유형으로 생각하고 있다고 가정합니다.

class ToList a where
    toList :: a b -> [b]

data HTree a b = Nil | Node a b (HTree a b) (HTree a b)

instance ToList (HTree a) where
    toList Nil = []
    toList (Node x y l r) = toList l ++ [y] ++ toList r

test = toList (Node "a" 1 (Node "b" 2 Nil Nil) Nil)
-- test == [2,1]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top