在列表列表中,执行maximumBy(更高阶函数采用测试的比较函数)的惯用方法是什么,我们想要进行的比较是Python中列表的总和?
这是一个Haskell实现和示例输出:
> maximumBy (compare `on` sum) [[1,2,3],[4,5,6],[1,3,5]]
> [4,5,6]
Run Code Online (Sandbox Code Playgroud)
这些基础库函数的实现,只是为了完整性(如果你想使用reduce或者东西:)
maximumBy cmp xs = foldl1 maxBy xs
where
maxBy x y = case cmp x y of GT -> x; _ -> y
k `on` f = \x y -> f x `k` f y
sum = foldl' (+) 0
Run Code Online (Sandbox Code Playgroud) 是否有哈希等价物map?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
Run Code Online (Sandbox Code Playgroud)
我知道我可以循环通过键.
我正在寻找haskell中的函数来压缩两个长度可能不同的列表.
我可以找到的所有zip函数只删除比另一个更长的列表的所有值.
例如:在我的练习中,我有两个示例列表.
如果第一个比第二个短,我必须用0填充.否则我必须使用1.
我不允许使用任何递归.我只需要使用更高阶的函数.
我可以使用任何功能吗?
到目前为止,我真的找不到任何解决方案.
我见过一个函数有一个由ClassName给出的参数的例子.()这似乎不是一个扩展函数,它是ClassName.Function()
一个例子是Kotterknife:
private val View.viewFinder: View.(Int) -> View?
get() = { findViewById(it) }
Run Code Online (Sandbox Code Playgroud)
其中我不太了解其功能,
fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer {
val builder = DrawerBuilderKt(this)
builder.setup()
return builder.build()
}
Run Code Online (Sandbox Code Playgroud)
代码允许您直接调用的地方
drawer {
...
}
Run Code Online (Sandbox Code Playgroud)
而不是给括号括起来的参数.
在任何地方都有这方面的文件吗?
android object higher-order-functions kotlin navigation-drawer
考虑这个课程:
case class Person(val firstName: String, val lastName: String, age: Int)
val persons = Person("Jane", "Doe", 42) :: Person("John", "Doe", 45) ::
Person("Joe", "Doe", 43) :: Person("Doug", "Don", 65) ::
Person("Darius", "Don", 24) :: Person("Dora", "Don", 20) ::
Person("Dane", "Dons", 29) :: Nil
Run Code Online (Sandbox Code Playgroud)
为了得到所有人的年龄总和,我可以编写如下代码:
persons.foldLeft(0)(_ + _.age)
Run Code Online (Sandbox Code Playgroud)
但是如果我想使用sum,我需要先映射该值,代码如下所示:
persons.map(_.age).sum
Run Code Online (Sandbox Code Playgroud)
如何在不创建某些中间集合的情况下使用该sum方法?
(我知道这样的"优化"很可能在没有在紧密循环中运行时没有任何真正的性能差异,而且我也知道懒惰的视图等等.)
是否有可能像这样的代码
persons.sum(_.age)
Run Code Online (Sandbox Code Playgroud)
做什么foldLeft/ 做什么reduceLeft?
考虑以下返回lambda的函数:
std::function<int()> make_counter()
{
int i = 0;
return [=]() mutable { return i++; };
}
Run Code Online (Sandbox Code Playgroud)
是否可以返回实际的lambda类型,而不将其包装成std::function?
我正在尝试使用Kotlin/Android数据绑定尝试将函数作为绑定适配器中的参数.此示例代码e: error: cannot generate view binders java.lang.StackOverflowError在构建时抛出,而日志中没有其他有用信息.
这是我的绑定适配器:
@JvmStatic
@BindingAdapter("onDelayedClick")
fun onDelayedClick(view: View, function: () -> Unit) {
// TODO: Do something
}
Run Code Online (Sandbox Code Playgroud)
XML:
<View
android:id="@+id/test_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:onDelayedClick="@{() -> viewModel.testFunction()}"/>
Run Code Online (Sandbox Code Playgroud)
我的ViewModel中的方法和方法:
fun testFunction() = Unit
Run Code Online (Sandbox Code Playgroud)
我一直在努力解决这个问题,而且我尝试过的任何工作都没有,所以任何帮助都会受到赞赏.
我有一个Composable带有 lambda 的函数,用于获取按钮单击操作。我想预览一下这个Composable功能。但是使用这种 lambda 的可组合函数在添加@Preview上面的注释后会出现错误@Composable
Composable functions with non-default parameters are not supported in Preview unless they are annotated with @PreviewParameter.
可组合函数看起来像
@Composable
fun MyView(onViewButtonClick: () -> Unit) {
Button(
enabled = isEnabled, colors = ButtonDefaults.buttonColors(
backgroundColor = greenColor
),
shape = Shapes.large, onClick = (onViewButtonClick),
modifier = Modifier
.fillMaxWidth()
.padding(15.dp, 40.dp, 15.dp, 15.dp)
) {
Text(
text = stringResource(id = R.string.send_otp),
color = Color.White,
fontSize = 20.sp
)
}
}
Run Code Online (Sandbox Code Playgroud)
这个的应用看起来像
MyView(onViewButtonClick …Run Code Online (Sandbox Code Playgroud) android higher-order-functions kotlin android-jetpack android-jetpack-compose
来自 Node.js,我可以做类似的事情:
// given an array `list` of objects with a field `fruit`:
fruits = list.map(el => el.fruit) # which will return an array of fruit strings
Run Code Online (Sandbox Code Playgroud)
有什么办法可以用 Go 中的优雅单行来做到这一点吗?
我知道我可以用范围循环来做到这一点,但我正在寻找单行解决方案的可能性。
假设我有更高阶的功能f :: (a -> b) -> (a -> b).但f只有在输入函数是满射的情况下才能正常运行.反正有没有迫使这种情况发生在Haskell?例如,我真的希望f类型签名是这样的:
f :: (Surjective (a -> b)) => (a -> b) -> (a -> b)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为我不希望a -> b声明该类型的所有函数都是满射的,只是其中的一部分.例如,可以f将满射函数转换为非满射函数.
我们可以将函数包装在一个特殊的数据类型中data Surjective f = Surjective f,然后定义
f :: Surjective (a -> b) -> (a -> b)
Run Code Online (Sandbox Code Playgroud)
但这会使很难为函数分配多个属性.
在练习中有没有方便的方法呢?这在理论上是否可行?