당신은 별칭으로 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는 초보자를위한 훌륭한 자원이며 모든 이것과 더 많은 이해하는 데 도움이됩니다.
1 : 1 맵을 원하십니까? –
'((1, 4), (2, 5), (3, 6)]'또는'k'와'v'의 모든 조합과 같기를 원하십니까? 만약 앞의 경우,'zipWith Assoc k v'를 사용하십시오. 후자는'??? '가있는 곳에'v'<- v'를 넣으십시오. – bheklilr