为什么函数名在haskell中重复?(新手)

为什么函数名在haskell中重复?(新手),haskell,Haskell,为什么函数名在中重复 例如: lucky :: (Integral a) => a -> String lucky 7 = "LUCKY NUMBER SEVEN!" lucky x = "Sorry, you're out of luck, pal!" 我什么时候不应该重复函数名?这是什么意思 谢谢我想你正在看。在那个例子之后,它说 当您调用lucky时,将从上到下检查模式,当它符合模式时,将使用相应的函数体 因此,第一行指示函数的类型,后面的行是要检查的模式。每行

为什么函数名在中重复

例如:

lucky :: (Integral a) => a -> String  
lucky 7 = "LUCKY NUMBER SEVEN!"  
lucky x = "Sorry, you're out of luck, pal!"   
我什么时候不应该重复函数名?这是什么意思


谢谢

我想你正在看。在那个例子之后,它说

当您调用lucky时,将从上到下检查模式,当它符合模式时,将使用相应的函数体

因此,第一行指示函数的类型,后面的行是要检查的模式。每行都有函数名,因此编译器知道您仍然在谈论同一个函数

这样想:当您编写表达式
lucky(a+b)
或任何东西时,编译器将尝试用函数定义中“fits”的
=
前面的第一件事替换
lucky(a+b)
。因此,如果
a=3
b=4
,您将得到以下一系列替换:

lucky (a+b) =
lucky (3+4) =
--pattern matching occurs...
lucky 7 =
"LUCKY NUMBER SEVEN!"

这是哈斯克尔在实践中如此容易推理的部分原因;你得到了一个类似于数学的系统。

幸运的定义使用“模式匹配”,并等于(在本例中)


你所看到的是模式匹配在起作用

我将向您展示另一个示例:

test 1 = "one"
test 2 = "two"
test 3 = "three"
ghci中的演示:

ghci> test 1
"one"
ghci> test 2
"two"
ghci> test 3
"three"
ghci> test 4
"*** Exception: Non-exhaustive patterns in function test
因此,当您调用任何函数时,运行时系统将尝试匹配 具有已定义函数的输入。因此,调用
测试3
将 首先检查
test 1
,由于
1
不等于
3
,它将 继续下一个定义。同样,由于
2
不等于
3
, 它将进入下一个定义。在下一个定义中,因为
3
是 等于
3
它将返回
“三”
字符串。当你试图 模式匹配一些根本不存在的东西,程序
抛出异常。

这种模式匹配可以转换为
case
语句(事实上,编译器通常会这样做!):

因为没有真正使用
x
,所以您通常会写
。->“对不起,…”

请注意,这与2不同

lucky'' n = if n==7 then ...
(==)
进行相等性比较通常比模式匹配更昂贵,而且结果也更丑陋


1为什么更昂贵:假设我们有一个大数据结构。为了确定它们是相等的,程序需要挖掘整个结构,确保所有分支都是相等的。然而,如果您的模式匹配,您将只比较您现在感兴趣的一小部分


2实际上,这种情况也是一样的,只是因为编译器在数字模式匹配方面有一个特殊的技巧:它用
(==)
重写它。这对于
Num
类型来说非常特殊,对于其他任何类型来说都不是这样。(除非您使用。)

对于数字类型,模式匹配和
(==)
确实是等效的,但一般情况下并非如此。模式匹配是首选的,无论是使用多个函数子句还是使用
case
语句。请注意,算术模式匹配是不受欢迎的,因为它不遵循通常的模式匹配规则。@Cubic我写的
lucky(a+b)
是一个表达式,而不是一个模式。我会编辑得更清楚。这是一个相当奇怪的把戏。它对于字符串(带有GHC重载字符串扩展)和精确数字非常有意义,但对于不精确数字就没有这么多意义了。与Scheme不同的是,Haskell无法识别精确数字和不精确数字之间的区别,因此它最终支持浮点模式匹配,这似乎有点奇怪。(很抱歉,在您回复时,我碰巧删除了我之前的评论,我之前做了一些实验,并弄清楚了交易内容)。@dfeuer:没关系,无论如何,评论都是暂时的。。。同意,关于不精确的数字是不好的。但是为什么首先要为浮点写模式匹配呢最好是像
f(3.14…=“接近pi”这样的形式的模式;f_u=“与pi无关”
,但这需要一个更为复杂的转换。
lucky' n = case n of
    7 -> "LUCKY NUMBER SEVEN!"
    x -> "Sorry, you're out of luck, pal!"
lucky'' n = if n==7 then ...