2012-07-30 1 views
0

지금까지 내가 가진 하스켈에서 분수 배낭 문제를 어떻게하려고하스켈, 다른 유형의 목록의 목록을 가져 오는 중 오류 값 (FRAC 배낭 확률값)

코드 :

{- Input "how much can the knapsack hole <- x" "Possible items in sack [(label, value, weight), ...]" -} 
knap x [] = [] 
knap x y = if length y == 1 then 

입력 목록 [([Char], Integer, Integer), ...] 형식의 목록입니다 (문자, 정수 및 정수 목록).

내 문제는 배낭에 넣을 수있는 각 항목의 레이블, 값 및 무게를 뽑으려고합니다. 내 서곡에서

(리스트의 목록에서 값을 당겨)> 프롬프트에서 내가 수행하여 몇 가지 시도를하고있는 중이 야

ghci 출력 :

Prelude> let x = [("label 1", 2, 14), ("label 2", 1, 15)] 
Prelude> :t x 
x :: [([Char], Integer, Integer)] 
Prelude> length x 
2 
Prelude> x !! 0 
("label 1",2,14) 
Prelude> x !! 0 !! 1 

<interactive>:1:1: 
    Couldn't match expected type `[a0]' 
       with actual type `([Char], Integer, Integer)' 
    Expected type: [[a0]] 
     Actual type: [([Char], Integer, Integer)] 
    In the first argument of `(!!)', namely `x' 
    In the first argument of `(!!)', namely `x !! 0' 

당신은 내가 목록을하려고 볼 수 있듯이 !! !! 색인 !! 색인을 사용하여 "항목"의 가중치를 가져 오십시오. 이를 수행하기위한 올바른 구문은 무엇입니까?

+0

첫 번째 코드 블록의 나머지 'if'표현식을 잊어 버린 적이 있습니까? 또한,'[([Char], Integer, Integer)]'는 튜플의리스트이며, 당신이 성취하고자하는 것이 아닙니다. 대신에 [[((Char), Integer, Integer)]]'를 찾을 수도 있습니다. –

+1

입력을 튜플 목록으로 허용해야하는 경우 튜플에 값을 가져 오는 방법은 무엇입니까? –

답변

2

음은 !! 연산자는, 목록에서 작동합니다.

튜플을 고수하고 싶다면 fstsnd 스타일로 3 튜플에 대한 고유 한 함수를 정의 할 수 있습니다. 패턴 매칭으로이 작업을 수행 할 수 있습니다. 같은 : 그러나

first :: (a,b,c) -> a 
first (a,_,_) = a 

은, 항목에 대한 데이터 유형을 설계하고, 당신이 필요로하는 분야를 추출하는 기록을 사용하는 것이 좋습니다 수 있습니다.

data Item = Item { label :: String 
        value :: Int 
        weight :: Int 
       } 

이 그럼 당신은 이제 let x = Item {label = "label 1", value = 2, weight = 14}

당신이 유형 [Item]의 항목의 목록로 배낭을 모델링 할 수 사용할 수 있으며, 첫 번째 항목의 값을 얻을 수 x 새 항목을 만들기 위해, 당신은 사용할 수 있습니다 value $ knapsack !! 0, 여기서 knapsack은 상품 목록입니다.

2

(a,b,c)은 목록이 아닌 튜플입니다. 튜플에 !!을 사용할 수 없습니다. 결국 : 튜플에 대해 !!의 유형은 무엇입니까?

let (name, x, y) = theTuple in 
-- ... 

패턴 일치는리스트의 선두에 얻을 보통 바람직한 방법이다

튜플로부터 값을 얻는 방법은 패턴 매칭이 같은 사용하는 것이다. 그래서 튜플의 목록에서 작업하는 기능은 일반적으로 다음과 같이 보일 것입니다 : [a] -> Int -> a : 당신은 그것의 유형 서명에서 볼 수

f [] = -- handle the empty list 
f ((name, x, y) : rest) = 
    -- do something with name, x and y and then recurse on rest