为什么函数名在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 ...