2017-01-02 9 views
0

haskell에 대한 시험 준비 교사는 우리에게 약간의 연습 문제를 제시했지만 문제를 논의한 날에는 아팠습니다.haskell에서 클래스의 인스턴스와 인스턴스를 계산하는 함수

data VodkaEnergy = Vodka Int | Energy Int | Mix VodkaEnergy VodkaEnergy 

내가 관리하지 않은하십시오 롱 드링크에 보드카와 에너지의 부분을 계산하는 함수를 작성)

1 : 그들 중 일부는 내가 그들 중 일부는 내가 알아낼 수 없습니다, 해결 훨씬 더 많은 일을보다 :

mixPortion :: VodkaEnergy->(Int,Int) 
mixPortion (Vodka x) = (x,0) 
mixPortion (Energy y) = (0,y) 
mixPortion (Mix x y) = (a,b) 
where a = fst (mixPortion x) 
     b = snd (mixPortion y) 

나는이 모든 입력을 잡으려고하지 않는 과도하게 단순화 솔루션을 실현하지만 난 손실에 있어요.

1b) 보드카 에너지는 보드카와 에너지의 비율이 같은 경우 2 개의 긴 음료를 동일하게 만들어야합니다.

내가 기능을 가지고 있지만 나는 그것을 같이 갈 것이라고 믿고있어 때까지 내가 해결할 수없는이 하나

instance Eq VodkaEnergy where 
x == y = mixPortion x == mixPortion y 

typeclasses 여전히 나를 위해 어려운, 그래서 저를 해결 않습니다.

2) 손실, 내가 지금까지 가진 모든 다시

data Tree = Leaf Int | Ndoe Int Tree Tree 

의 잎 + 노드의도 양이있는 경로를 계산하는 함수를 작성하는 것은 모든 노드를 계산하고 잎 기능입니다 도움이되지 않습니다 트리, 많은

3)

data Eq a => Set a = S [a] 

만들기 SET1의 모든 요소가 SET2 그 반대에 포함되어있는 경우 두 가지가 같은 식의 인스턴스 설정 그 반대.

작업의 데이터 유형이 "Eq a =>"로 컴파일되지 않기 때문에 혼란 스럽습니다.

instance (Eq a) => Eq (Set a) where 
x:set1 == set2  = x `elem` set2 && set1 == set2 && set2 == set1 

하지만 "X : SET1"그러나 내가 지금까지 노력하는 것은 이것이다가 다른 종류의

나는이 아마 초보자 질문 알고에게 기대 때문에 부분은 컴파일되지 않습니다. 내 말은, 난 초보자 야. 나는이 같은 haskell에 대한 질문에 대한 좋은 ressources를 찾기가 힘들어서 어딘가에 웹에 떠 다니는 해답을 놓친다면 나를 연결 시켜라. 솔직히 조금 필사적이고, 시험이 가까워지고 있습니다. 아직 기능적 프로그래밍을 제대로받지 못했습니다. 도움 주셔서 대단히 감사합니다.

+1

1a) 좋아 보이지만, 항상'fst' 또는'snd'가 아닌 전체 튜플을 함께 추가해야합니다. 1b) 좋아 보인다. –

+1

2) 가능한 모든 경로 목록을 추출해 보셨습니까? –

+1

3)'x : set1'이 의미하는 바는 모르지만, 이것은 하스켈 구문이 아닙니다. 두 세트/변수'set1'과'set2' (또는 longdrink 예제에서 사용한 것과 같은'x'와'y')가 필요하고 원하는 기준을 검사하는 함수를 사용해야합니다. –

답변

0
  1. 가) 거의 좋은,하지만 당신은 믹스의 두 부분의 보드카와 에너지 구성 요소뿐만 아니라 처음부터 보드카와 두 번째의 에너지를 추가해야합니다. 가능한 경우 fstsnd과 같은 접근 자 메서드 대신 패턴 일치를 사용하는 것이 더 좋을 수 있습니다.

    mixPortion :: VodkaEnergy -> (Int,Int) 
    mixPortion (Vodka x) = (x,0) 
    mixPortion (Energy y) = (0,y) 
    mixPortion (Mix x y) = (v1+v2,e1+e2) 
        where (v1,e1) = (mixPortion x) 
         (v2,e2) = (mixPortion y) 
    

    b)가 맞습니다.

  2. 내가 코멘트에서 말했듯이, 정확히 어떤 질문이 원하는지 나는 정말로 모른다.작업이 루트에서 리프까지 짝수 경로 수를 찾는 것이라고 가정하면 다음과 같이 접근 할 수 있습니다. 짝수 경로와 홀수 경로의 수를 제공하는 함수 evenOddBranches :: Tree -> (Int,Int)을 작성합니다. 노드를 경로에 추가하면 노드의 하위 트리의 짝수 경로가 홀수 경로이기 때문에 더 쉽습니다. 그렇게하면 간단한 재귀를 얻을 수 있습니다. 노드의 짝수 경로는 홀수 경로의 합이 두 개의 하위 트리이고 홀수 경로 수가 하위 트리의 짝수 경로의 합입니다.

  3. SetEq 제약은 올바른 구문을 해야하는 데 사용하지만, 하스켈 2010 년 이후 더 이상이 그냥 데이터 정의에 Eq 제약 밖으로 잎 필요한 곳을 추가하는 것입니다 할 수있는 올바른 방법이 아닙니다.

    코드에 몇 가지 결함이 있습니다. 먼저 목록이 아니기 때문에 x:set1으로 패턴 일치시킬 수는 없지만 SetS 래퍼라는 의미입니다. 따라서 대신 패턴 일치 (S (x:xs))해야합니다. xs은 목록이며 Set이 아니므로 재귀 호출의 경우 다시 S으로 묶어야합니다. 또한 S (x:xs)에서 일치하는 사람은 S []과 일치해야합니다. 구문 수준에서 코드를 수정하면 다음과 같이됩니다.

    data Set a = S [a] 
    instance (Eq a) => Eq (Set a) where 
        S [] == S []  = True 
        S [] == S (_:_) = False 
        S (x:xs) == S ys = x `elem` ys && S xs == S ys && S ys == S xs 
    

    이 코드는 컴파일되지만 작동하지 않습니다. 예를 들어 S [0] == S [0]False입니다.

    설정 동등성을 작성하는 가장 쉬운 방법은 2 개의 포함 된 포함입니다. 따라서 subsetEq :: Eq a => Set a -> Set a -> BoolTrue 인 함수를 작성해야합니다. 첫 번째 세트의 모든 요소가 두 번째 세트의 요소이기도합니다. 나는 이것이 실제로 당신이 할 수있는 최선입니다 만 Eq 제약으로 생각

    instance (Eq a) => Eq (Set a) where 
        set1 == set2 = set1 `subsetEq` set2 && set2 `subsetEq` set1 
    

    : 그럼 당신은이 같은 일련의 평등을 구현할 수 있습니다.

+0

감사합니다. 작업 # 2와 마찬가지로 루트에서 시작하는 모든 짝수 경로를 계산합니다. 하지만 조언을 해준 덕분에 지금 뭔가하고 있습니다. – banzai