gpt4 book ai didi

haskell - 如何处理将函数应用于不正确的值?

转载 作者:行者123 更新时间:2023-12-02 04:08:09 25 4
gpt4 key购买 nike

如果我有数据并且不确定这是一个整数还是一个字符串,但我想对其应用(+1),如果它是一个很好的整数,但如果它是一个字符串 - 什么都不做,怎么办我会处理这个吗?这就是 Nothing 发挥作用的地方吗?

最佳答案

嗯,Haskell 函数是强类型的,这意味着它们指定输入和输出的类型。为了首先接受多种类型的值,您需要使用 Either将它们保持在同一类型中。因此,例如,如果您想收到 StringInteger ,那么你的函数必须具有类型:

f :: Either String Integer -> ...

然后,编写函数的方式是在 Either 上进行模式匹配查看您收到的值类型。你可以这样写:

-- str is a String
f (Left str) -> ...
-- int is an Integer
f (Right int) -> ...

因此,执行您想要的操作的最简单方法是仅在数字为 Integer 时增加数字。 ,但保留String未受影响。你可以这样写:

-- Don't do anything if it is a string
f (Left str) = Left str
-- Increment it if it is an integer
f (Right int) = Right (int + 1)

如果你要求编译器推断上述函数的类型,你将得到:

f :: Either String Int -> Either String Int

Haskell 有一个很好的技巧来避免上述样板,即使用 fmap来自Functor类(class)。这让我们可以自动在 Right 上编写函数。一半Either同时完全忽略 Left 中的任何内容一半,像这样:

f = fmap (+1)

如果我们推断上述函数的类型,它实际上是:

f :: (Functor f, Num a) => f a -> f a

但在我们的例子中,我们可以通过设置 a 来专门化类型。至IntegerfEither String :

f :: Either String Int -> Either String Int

换句话说,Either StringFunctor 实例的一个示例类,其中有很多。

但是,请注意,为了在整数或字符串上使用此函数,您必须首先将它们包装在 Left 中。或Right构造函数。例如,这些不会进行类型检查:

f 1   -- WRONG!
f "a" -- WRONG!

但是这些会:

f (Right  1) -- Correct!
f (Left "a") -- Correct!

这意味着,如果您有一个整数和字符串列表,则必须将其写成如下形式:

list = [Right 1, Left "a", Right 2]

请注意,如果您尝试在列表中混合整数和字符串,则会出现类型错误:

list = [1, "a", 2] -- WRONG!

然后我们可以映射f超过第一个正确的list得到:

map f list = [Right 2, Left "a", Right 3]

关于haskell - 如何处理将函数应用于不正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12465807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com