2015-02-05 2 views
0

두 목록에서 정의한 assoc 유형의 목록을 반환하는 함수를 만들려고합니다. 목록 이해력을 사용하는 방법에 대해 생각하지만 각 목록에서 가치를 얻는 방법을 모르겠습니다.목록 이해를 사용하여 Haskell에서 새로운 유형의 목록을 만듭니다.

type Assoc k v = [(k, v)] 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc k v = 
    [Assoc k' v' | k' <- k, ???] 

main :: IO() 
main = do 
    putStrLn $ show makeAssoc [1,2,3] [4,5,6] 

makeAssoc k v을 구현하는 방법은 무엇입니까?

+0

1 : 1 맵을 원하십니까? –

+1

'((1, 4), (2, 5), (3, 6)]'또는'k'와'v'의 모든 조합과 같기를 원하십니까? 만약 앞의 경우,'zipWith Assoc k v'를 사용하십시오. 후자는'??? '가있는 곳에'v'<- v'를 넣으십시오. – bheklilr

답변

5

당신은 별칭으로 Assoc k v 정의 (type은 기존의 형태에 새로운 이름을 부여 구별 유형을 작성하지 않습니다 - 그들은 여전히 ​​상호 교환) (k, v)의 목록. makeAssoc 형식 시그니처에 따라 Assoc k v의 목록을 반환합니다. 즉, 실제로는 (k, v)의 목록을 반환하며 이는 아마도 원하는 것이 아님을 의미합니다. 두 가지 가능한 솔루션 :

해결 방법 1 - 튜플 목록으로 Assoc k v을 유지하고 [] makeAssoc

의 유형 서명
type Assoc k v = [(k, v)] 

makeAssoc :: [k] -> [v] -> Assoc k v 

해결 방법 2에서 제거 - 튜플 (안 목록 Assoc k v 별칭을 확인 튜플) 및 유지하려면 [] makeAssoc의 유형 서명에

type Assoc k v = (k, v) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 

또 다른 문제는 type Assoc k v는 유형 서명에 사용할 수있는 별칭 Assoc k v을 만드는이지만, '아무튼 해당 데이터 생성자를 사용하여 실제 고유 한 유형을 작성하십시오. 따라서 함수의 실제 구현에 Assoc k v을 사용할 수 없습니다.

type Assoc k v = (k, v) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc ks vs = [(k, v) | k <- ks, v <- vs] 

그러나 목록 함축은 각 목록에서 하나 개의 요소를 사용하여 모든 가능한 쌍을 줄 것이다 : 그건 우리가 간단한 튜플로 작업 및 지능형리스트에 대한 올바른 구문은 (앞에서 두 번째 솔루션을 사용) 것을 의미한다. 예 : makeAssoc [1, 2] [3, 4][(1, 3), (1, 4), (2, 3), (2, 4)]이됩니다. 실제로 일대일 직접 매핑을 원하면 zip을 사용해야합니다.

type Assoc k v = (k, v) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc ks vs = zip ks vs 

이 구현을 사용하면 결과는 [(1, 3), (2, 4)]이됩니다.

편집 :

은 더 나아가 :

type Assoc k v = (k, v) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc = zip 

또 다른 것은 : 당신이 하스켈에서 더 많은 경험을 얻을 때, 당신은 당신이 같은 일을 쓸 수 있었다는 것을 배울 것입니다 당신이 실제 별개을 원한다면 형식의 경우 data 키워드와 zipWith 함수를 사용할 수 있습니다.

data Assoc k v = Assoc k v 
    deriving (Show) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc ks vs = zipWith Assoc ks vs 

또는 이전과 매개 변수를 생략 :

data Assoc k v = Assoc k v 
    deriving (Show) 

makeAssoc :: [k] -> [v] -> [Assoc k v] 
makeAssoc = zipWith Assoc 

Learn you a Haskell는 초보자를위한 훌륭한 자원이며 모든 이것과 더 많은 이해하는 데 도움이됩니다.

+2

최종 코드 스 니펫에는 불필요한 람다 몇 개가 있습니다. –

+2

또한 'newtype'을 사용하여 제안 할 수도 있습니다 –

+0

좋은 지적 @SimonGibbons. 내가 뭘 생각하는지 모르겠다. 편집 중. – sonologico

관련 문제