我刚刚开始学习Haskell。据我所知,maximum给出了整数列表的最大值。因此,maximum [2,5,7,1]给出7。但是为什么通过给出元组输入,max总是给出第二个元素?例如,maximum (8,1)给1同样的事情发生的sum (8,1),product (5,2),minimum (4,5)...所有给出的元组的第二个元素。因此,有人可以向初学者解释为什么会发生这种情况吗?
正如问题所说,为什么toList (1, 2) == [2]?
我记得在映射元组时发生了类似的事情,但我不记得为什么或者它是否相关.
阅读真实世界Haskell和Typeclassopedia我得到的印象是2元组(a,b)在Haskell中可以扮演非常特殊的角色.
我遇到的第一个用途是lookup使用2元组列表作为字典.
然后我也遇到了这样((,) e)一个事实:它是一个仿函数的实例(但没有其他的n元组),这在上面的例子中很有意义(key,value).
现在最新的案例 - 我实际想要问的一个案例 - 在Typeclassopedia的第4.3章中.在那里它说这((,) a)是一个Applicative if a是一个幺半群的实例.你什么时候真正利用它?您使用Applicative实例的应用程序是(a,b)什么?
我知道有些人认为fail是个错误,我明白为什么.(似乎MonadPlus是为了取代它).但只要它存在,似乎使用部分函数fail而pure不是Just和Nothing.因为这将允许你做你现在可以做的所有事情和更多,所以像safeHead你可以给你传统的Just/ Nothing或者你可以返回[x]/ [].
从我所读到的内容MonadPlus看起来似乎比使用更好fail.但是我对此肯定不够了解,而且它也可能涉及拉入Prelude,这可能是一个好主意,但这将是一个比使用更大的变化fail.
所以我想我的问题是为什么部分函数不使用failOR MonadPlus,两者似乎都比使用具体类型更好.
为什么minimum (1, 2)Haskell中有2个?
我在GHCi的测试结果,
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Prelude> minimum (1, 2)
2
Run Code Online (Sandbox Code Playgroud)
它不应该返回1吗?
我们正在将我们的命令性大脑转变为功能最强大的范例.这个功能给我带来了麻烦.我想要构造的阵列,要么包括两对对或三对,根据条件(是否refreshToken是null).如何使用FP范例干净利落地完成这项工作?当然,对于命令式代码和变异,我只是有条件地.push()将额外的值放到最后看起来非常干净.
这是"本地突变是否正确"FP警告的一个例子?
(我们ReadonlyArray在TypeScript中使用强制实现不变性,这使得它更难看.)
const itemsToSet = [
[JWT_KEY, jwt],
[JWT_EXPIRES_KEY, tokenExpireDate.toString()],
[REFRESH_TOKEN_KEY, refreshToken /*could be null*/]]
.filter(item => item[1] != null) as ReadonlyArray<ReadonlyArray<string>>;
AsyncStorage.multiSet(itemsToSet.map(roArray => [...roArray]));
Run Code Online (Sandbox Code Playgroud)