簡體   English   中英

如何將函數的HList函數從某種類型映射到某種類型?

[英]How to map a function over the HList of functions from a certain type to some type?

為簡單起見,我們假設我的HList實例恰好包含2個值:

def intToString(x: Int) = x + "_"
def intToDouble(x: Int) = x * 10d
val fns = (intToString _ :: intToDouble _ :: HNil)

現在,我希望能夠做到這一點,獲得一些內容Hlist

(fns zip (1 :: 2 :: HList) map {case (f, x) => f(x) }

要得到

("1_", 10.0)

從現在開始,假設我不知道自己在做什么,而且我完全理解功能之神面孔中的所有瑕疵。

我已經看過沒有形狀的'wiki,據我所知,我應該從IntT創建一個可以被無形接受的函數。 我明白了嗎? 這是我得到的:

object mapApply extends Poly1 {
  implicit def default[T] = at[Function[Int,T]](f => f.apply _)
}

在這一點上,我完全迷失了,甚至不知道如何繼續。 但我對這可能帶來的潛在力量和表現力有點着迷,所以我真的很想了解這些東西是如何運作的。 如果您的答案不僅僅是代碼片段而是更開放和更具說明性,我將非常感激。

PS SO的引擎只是建議我一個c++標簽。 我說了一些C ++ - 是嗎?

看起來你正在混合方法和函數定義語法 - 我假設你的意思如下:

val intToString = (x: Int) => x + "_"
val intToDouble = (x: Int) => x * 10d
val fns = intToString :: intToDouble :: HNil

現在你可以使用zipApply ,它只是將函數和它們的參數配對:

val res = fns.zipApply(1 :: 2 :: HNil)

如果由於某種原因, zipApply不存在,你可以使用Poly1完成同樣的事情:

object apply extends Poly1 {
  implicit def default[I, O]: Case.Aux[(I => O, I), O] =
    at[(I => O, I)] { case (f, x) => f(x) }
}

val res = fns.zip(1 :: 2 :: HNil).map(apply)

或者,如果你不想要額外的通用性:

object applyToInt extends Poly1 {
  implicit def default[T]: Case.Aux[(Int => T, Int), T] =
    at[(Int => T, Int)] { case (f, x) => f(x) }
}

所以你離得太遠 - 你只需要在你的Poly1有一個用於函數和參數的案例,而不僅僅是函數。

暫無
暫無

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

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