gpt4 book ai didi

c# - 功能等同于重载

转载 作者:行者123 更新时间:2023-11-30 18:41:54 25 4
gpt4 key购买 nike

在函数式编程中我应该采用什么方法来重载方法(提供一个或多个具有相同函数名称的不同签名)。

我是函数式编程的新手,所以目前我还不太了解这个问题。

例如,在 C# 中,我有以下内容:

public int LowestCommonMultiple(int a, int b)
{
return (a * b) / GreatestCommonFactor(a, b); // details ommited
}

public int LowestCommonMultiple(List<int> integers)
{
int commonMultiple = integers[0];
foreach(var integer in integers)
{
commonMultiple = LowestCommonMultiple(commonMultiple, i);
}
return commonMultiple;
}

谢谢,

编辑:我不需要 C# 中的答案,我的问题更像是一个功能性的 pargadim 问题,例如,在 Haskell 中考虑它。我认为重载方法不是一种选择。

最佳答案

在 Haskell 中,overloading is done using type classes .这与 C# 中的重载完全不同,因为类型类更类似于 C# 中的接口(interface),尽管它们也更强大*。

例如,要有一个能够接受 IntegerBool 的函数,您可以这样写:

class Foo a where
foo :: a -> String

instance Foo Integer where
foo n = show (n+42)

instance Foo Bool where
foo b = if b then "Hello" else "Goodbye"

在解释器中对此进行测试,我们看到函数 foo 具有带约束的类型。

*Main> :t foo
foo :: Foo a => a -> String

这意味着该函数将适用于类型 a,我们已经为其定义了一个 Foo 实例。

*Main> foo 1295
"1337"
*Main> foo False
"Goodbye"

如果我们尝试在没有此类实例的类型上使用它,则会出现错误。

*Main> foo "Hello"

<interactive>:1:1:
No instance for (Foo [Char])
arising from a use of `foo'
Possible fix: add an instance declaration for (Foo [Char])
In the expression: foo "Hello"
In an equation for `it': it = foo "Hello"

对于您的示例,我认为在 Haskell 中以这种方式重载此函数不是很有用。事实上,标准库中的lcm函数已经重载了。

*Main> :t lcm
lcm :: Integral a => a -> a -> a

这意味着它将适用于任何有 Integral 实例的类型。在这种情况下,这是所有类似整数的类型,包括机器大小的 Int、任意大小的 Integer 和其他类型,例如 Int32 , Int64 等等。

列表版本可以写成 foldl1' lcm,因此一开始就没有必要提供这样的重载。

* 一方面,类型类实例与其应用的对象分开传递。这使得诸如多重分派(dispatch)之类的事情变得更加清晰。这也意味着您可以重载函数的返回类型,这在 C# 中是不可能的。类型类也可以与类型构造函数一起使用; Monad 可能是这种类型类最著名的例子。

关于c# - 功能等同于重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266974/

25 4 0
文章推荐: php -