要使用foldr计算列表的长度,可以执行以下操作:
foldr (\_ acc -> acc + 1) 0
Run Code Online (Sandbox Code Playgroud)
进一步扩展折叠函数需要增加第二个参数的想法,我想出了这个(这是错误的):
foldr ((+1) . (flip const)) 0`
Run Code Online (Sandbox Code Playgroud)
进一步检查该类型揭示了这一点:
(+1) . (flip const) :: Num (c -> c) => a -> c -> c
Run Code Online (Sandbox Code Playgroud)
Haskell高阶函数计算长度 在该页面上有一个有趣的评论,我真的无法理解
foldr (((+1).).(flip const)) 0
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个组合是如何运作的吗?
由于相关类型IntoIter
的的IntoIterator
特点,实现了Iterator
特质,是不是有足够的推断关联的类型Item
?
给一个带有多个子句的函数,我想只模拟一个特定的情况,并且对于否则会导致'function_clause'错误的每个其他输入,我想让它由原始函数处理.它几乎就像是erlang meck中的选择性passthrough.
这就是 Sum 当前的定义方式。
newtype Sum a = Sum {getSum :: a}
有没有人有例子说明它在数字上下文之外如何有用?如果不是,那么我们为什么不在定义 newtype 时将 the约束a
为 beNum a
呢?为什么会有人想要定义 aSum "hello"
呢?
为什么甚至[1,1] == &[1,1]
不编译(可能是因为它们是不同的类型),但下面的代码片段编译并运行正常.
let a: [i32; 100] = [1; 100];
let b: &[i32] = &a[1..3];
if b == [1, 1] { // comparison with &[1, 1] works as well
println!("it works"); // this does get printed
}
Run Code Online (Sandbox Code Playgroud)