我从Frisby 教授的《函数式编程最充分指南》中走出来,似乎对 Maybe 有一种误解。
我相信:
map(add1, Just [1, 2, 3])
// => Just [2, 3, 4]
我对上述指南的感觉是Maybe.map
应该尝试调用Array.map
数组,本质上是返回Just(map(add1, [1, 2, 3])
。
当我尝试使用Sanctuary的 Maybe 类型和最近Elm的 Maybe 类型时,我很失望地发现他们都不支持这个(或者,也许我不明白他们是如何支持这个的)。
在圣域,
> S.map(S.add(1), S.Just([1, 2, 3]))
! Invalid value
add :: FiniteNumber -> FiniteNumber -> FiniteNumber
^^^^^^^^^^^^
1
1) [1, 2, 3] :: Array Number, Array FiniteNumber, Array NonZeroFiniteNumber, Array Integer, Array ValidNumber
The value at position 1 is not a member of ‘FiniteNumber’.
在榆树,
> Maybe.map sqrt (Just [1, 2, 3])
-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm
The 2nd argument to function `map` is causing a mismatch.
4| Maybe.map sqrt (Just [1, 2, 3])
^^^^^^^^^^^^^^
Function `map` is expecting the 2nd argument to be:
Maybe Float
But it is:
Maybe (List number)
同样,我觉得我应该能够将 aJust(Just(1))
视为 a Just(1)
。另一方面,我的直觉[[1]]
完全相反。显然,map(add1, [[1]])
应该返回[NaN]
而不是[[2]]
或任何其他东西。
在 Elm 中,我能够做到以下几点:
> Maybe.map (List.map (add 1)) (Just [1, 2, 3])
Just [2,3,4] : Maybe.Maybe (List number)
这是我想做的,但不是我想做的。
一张地图应该如何覆盖Maybe List?