如何嵌套未装箱的载体?

时间:2017-05-20 06:44:08

标签: arrays haskell vector

这可能是一个非常基本的问题,但我已经四处寻找,似乎无法找到答案。

我想使用未装箱的矢量来表示2D列表。使用法线向量很容易做到这一点:

> import qualified Data.Vector as V
> V.fromList [V.fromList [1..5]]
[[1,2,3,4,5]]

但是,如果我尝试使用未装箱的载体:

> import qualified Data.Vector.Unboxed as U
> U.fromList [U.fromList [1..5]]

我收到以下错误:

• Non type-variable argument
    in the constraint: U.Unbox (U.Vector a)
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    it :: forall a.
          (U.Unbox (U.Vector a), U.Unbox a, Num a, Enum a) =>
          U.Vector (U.Vector a)

我怀疑它与此有关:

> V.fromList [1..5]
[1,2,3,4,5]

,而

> U.fromList [1..5]
[1.0,2.0,3.0,4.0,5.0]

但我似乎无法理解如何避免这种情况。

提前致谢!

1 个答案:

答案 0 :(得分:5)

好吧,我们可以开始遵循编译器给出的建议:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 3
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let dateFormatter = DateFormatter()
    //dateFormatter.dateStyle = DateFormatter.Style.short
    dateFormatter.dateFormat = "dd.MM.yyyy HH:mm"

    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "workoutDateCell", for: indexPath) as! WorkoutDateTableViewCell
        cell.typeLabel.text = "Beginn"
        cell.dateDatepicker.date = Date()
        cell.dateDatepicker.tag = indexPath.row
        cell.dateLabel.text = dateFormatter.string(from: cell.dateDatepicker.date)
        cell.selectionStyle = .none
        return cell
    }
    else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "workoutDateCell", for: indexPath) as! WorkoutDateTableViewCell
        cell.typeLabel.text = "Ende"
        cell.dateDatepicker.date = Date()
        cell.dateDatepicker.tag = indexPath.row
        cell.dateLabel.text = dateFormatter.string(from: cell.dateDatepicker.date)
        cell.selectionStyle = .none
        return cell
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "workoutSportsCell", for: indexPath) as! WorkoutSportsTableViewCell
        cell.sportsLabel.text = "Sportart"
        cell.sportstypeLabel.text = workoutSports[coreData.getSportsIndex()]
        cell.sportsPicker.delegate = self
        cell.sportsPicker.dataSource = self
        cell.sportsPicker.selectRow(coreData.getSportsIndex(), inComponent: 0, animated: false)
        cell.selectionStyle = .none
        return cell
    }
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if selectedCellIndexPath == indexPath.row {
        return selectedCellHeight
    }
    return unselectedCellHeight
}

然而:

> :set -XFlexibleContexts

这里的问题是你无法取消装箱矢量(即使它是未装箱的数据)。要取消装箱数据类型,您需要精确描述字节布局,包括其大小。但是矢量没有大小。考虑例如。

> U.fromList [U.fromList [1..5]]

<interactive>:10:1: error:
    • No instance for (U.Unbox (U.Vector a0))
        arising from a use of ‘print’

即使在C中,这也需要"jagged" matrix,通常用指针(=拳击)表示。