簡體   English   中英

什么時候空HList不是HList?

[英]When is an empty HList not an HList?

在學習無形的同時,我想知道為什么這不能編譯:

def someHList[H <: HList]: H = HNil

既然HNil對象擴展了擴展HList的HNil特征?

在trait中定義一個方法的正確方法是什么,它返回一些HList,它只在擴展類中實現?

我想做類似以下的事情:

trait Parent {
  def someHList[H <: HList]: H
}

object Child1 extends Parent {
  def someHList[H <: HList] = HNil
}

object Child2 extends Parent {
  def someHList[H <: HList] = 1 :: "two" :: HNil
}

任何建議表示贊賞。 謝謝!

編輯

詳細闡述,因為我意識到我在原始問題中未說明的內容:

1.)希望不必在每個實現類中明確指定H ,而是推斷它(在調用站點?)。

2.)我想在父特征中使用HNil作為默認實現,可以選擇在子類中重寫。 我的例子應該是:

trait Parent {
  def someHList[H <: HList]: H = HNil
}

object Child extends Parent {
  override def someHList[H <: HList] = 1 :: "two" :: HNill
}

HNil對象是一個HList 但它是沒有必要的H

定義如

def someHList[H <: HList]: H = HNil

應該讀作

對於任何type HHList子類型有一種方法來構造它的成員,它將是HNil

這顯然是錯誤的

正如我所感覺的那樣,你正在嘗試做的事情是它的改寫版本

有一個type H類型, HList子類型和構造它的成員的方法

如果是這樣,你可以像這樣使用類型成員:

import shapeless._

trait Parent {
  type H <: HList
  def someHList: H
}

object Child1 extends Parent {
  type H = HNil
  def someHList: H = HNil
}

object Child2 extends Parent {
  type H = Int :: String :: HNil
  def someHList: H = 1 :: "two" :: HNil
}

更新

您也可以稍微重構它以使某些類型自動推斷出來

abstract class Parent[H <: HList](val someList: H)
object Child1 extends Parent(HNil: HNil)
object Child2 extends Parent(1 :: "two" :: HNil)

您可能會注意到HNil類型是手動設置的,這是因為object HNil的類型是HNilHNil.type子類型,這有時會導致編譯器錯誤的方式

如果只使用HList作為返回類型,那么一切正常:

trait Parent {
  def someHList: HList
}

object Child1 extends Parent {
  def someHList = HNil
}

object Child2 extends Parent {
  def someHList = 1 :: "two" :: HNil
}

或者對於問題的更新版本:

trait Parent {
  def someHList: HList = HNil
}

object Child2 extends Parent {
  override def someHList = 1 :: "two" :: HNil
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM