1
S.min ('1') ('02') =>'02'

为什么这甚至可能?(是的,类型强制...但这是 Sanctuary)可以配置 Sanctuary 以便在使用字符串时不返回任何内容吗?有没有一种优雅的方法来处理这个问题?

4

1 回答 1

1

让我们考虑以下类型S.min

min :: Ord a => a -> a -> a

String满足 Ord 的要求,因此String -> String -> String是一种可能的专业化:

> S.min ('foo') ('bar')
'bar'

如果您正在处理应该是数字但可能不是数字的输入,最好的方法是预先处理不确定性:

//    untrustedInput1 :: Any
//    untrustedInput2 :: Any

//    input1 :: Maybe Number
const input1 = S.filter (S.is ($.Number)) (S.Just (untrustedInput1));

//    input2 :: Maybe Number
const input2 = S.filter (S.is ($.Number)) (S.Just (untrustedInput2));

然后,您可以使用S.lift2转换S.min为可以对Maybe Number值进行操作的函数:

S.lift2 (S.min) :: (Apply f, Ord a) => f a -> f a -> f a

上面的签名可以像这样专门化:

S.lift2 (S.min) :: Maybe Number -> Maybe Number -> Maybe Number

最后一步是应用于S.lift2 (S.min)可信输入:

S.lift2 (S.min) (input1) (input2)

这是一个完整的工作示例:

> S.lift2 (S.min)
.         (S.filter (S.is ($.Number)) (S.Just ('1')))
.         (S.filter (S.is ($.Number)) (S.Just ('02')))
Nothing
于 2020-07-08T10:26:27.793 回答