【发布时间】:2018-01-11 09:24:39
【问题描述】:
我离开 Professor Frisby's Mostly Adequate Guide to Functional Programming 时似乎对 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)
同样,我觉得我应该能够将Just(Just(1)) 视为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?
【问题讨论】:
-
在 Haskell 中,有一个为 composition of two Functors 定义的 Functor 实例,因此
fmap在组合的 Functor 内部可以工作两层。在import Data.Functor.Compose之后,getCompose $ fmap (1+) $ Compose $ Just [1,2,3]返回Just [2,3,4]。Compose/getCompose只是类型系统的助手。 -
Haskell 拥有一切,嗯!?
标签: functional-programming monads elm maybe sanctuary