[英]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,據我所知,我應該從Int
到T
創建一個可以被無形接受的函數。 我明白了嗎? 這是我得到的:
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.