【问题标题】:Haskell, list of list of different types, retriving values (frac knapsack prob)Haskell,不同类型列表的列表,检索值(frac knapsack prob)
【发布时间】:2012-07-30 17:07:10
【问题描述】:

到目前为止,我正在尝试在 haskell 中解决分数背包问题

代码:

{- 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), ... ] 列表列表 (list of chars, integer, and 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'

如您所见,我正在尝试做列表!指数 !!索引以尝试从“项目”中拉出重量。这样做的正确语法是什么?

【问题讨论】:

  • 您是否忘记了第一个代码块中的 if 表达式的其余部分?此外,[([Char], Integer, Integer)] 是一个元组列表,这不是您想要实现的目标。您可能正在寻找 [[([Char], Integer, Integer)]]
  • 如果我必须允许输入是一个元组列表,我如何获得元组中的值?

标签: haskell knapsack-problem


【解决方案1】:

好吧,!! 运算符仅适用于列表,从它的类型签名可以看出:[a] -&gt; Int -&gt; a

如果您想坚持使用元组,您可以以fstsnd 的样式为三元组定义自己的函数。您可以通过模式匹配来做到这一点;类似:

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

但是,最好为项目设计数据类型,并使用记录来提取您需要的字段。

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

然后要创建一个新项目x,您可以使用let x = Item {label = "label 1", value = 2, weight = 14}

现在您可以将您的背包建模为[Item] 类型的项目列表,并且要获取第一个项目的值,您可以使用value $ knapsack !! 0,其中knapsack 是您的项目列表。

【讨论】:

    【解决方案2】:

    (a,b,c) 是一个元组,而不是一个列表。您不能在元组上使用 !!。毕竟:对于元组,!! 的类型是什么?

    从元组中获取值的方法是使用这样的模式匹配:

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

    模式匹配通常也是获得列表头部的首选方式。因此,处理元组列表的函数通常看起来像这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多