Haskell中的函数模式匹配

Haskell中的函数模式匹配,haskell,Haskell,我试图学习哈斯凯尔在指导你学习哈斯凯尔,但以下困惑我 lucky :: (Integral a) => a -> String lucky 7 = "LUCKY NUMBER SEVEN!"   lucky x = "Sorry, you're out of luck, pal!" 如您所见,上面有一行说明函数的确切类型。但这有必要吗?参数和返回值的类型不能从该行下面的模式中推断出来吗?你是对的,它们绝对不是必需的。然而,陈述函数类型是一种非常常见的做法,至少有两个原因: 告诉编

我试图学习哈斯凯尔在指导你学习哈斯凯尔,但以下困惑我

lucky :: (Integral a) => a -> String
lucky 7 = "LUCKY NUMBER SEVEN!"  
lucky x = "Sorry, you're out of luck, pal!"

如您所见,上面有一行说明函数的确切类型。但这有必要吗?参数和返回值的类型不能从该行下面的模式中推断出来吗?

你是对的,它们绝对不是必需的。然而,陈述函数类型是一种非常常见的做法,至少有两个原因:

  • 告诉编译器你的真正意思。如果您在编写函数时出错,编译器不会推断出错误的类型,但会警告您错误
  • 告诉阅读您代码的人。在理解代码的同时,他们必须找出函数的类型,因此您最好让他们更容易理解。显式使用该类型使代码更具可读性
这就是为什么,尽管它们是可选的,但顶级函数的类型几乎总是在Haskell代码中详细说明



为了完成齐塔人所说的,在这种情况下是没有必要的。但是,在某些情况下,当代码过于模糊而无法推断时,有必要指定函数的类型。

您是对的,它们绝对不是必需的。然而,陈述函数类型是一种非常常见的做法,至少有两个原因:

  • 告诉编译器你的真正意思。如果您在编写函数时出错,编译器不会推断出错误的类型,但会警告您错误
  • 告诉阅读您代码的人。在理解代码的同时,他们必须找出函数的类型,因此您最好让他们更容易理解。显式使用该类型使代码更具可读性
这就是为什么,尽管它们是可选的,但顶级函数的类型几乎总是在Haskell代码中详细说明




为了完成齐塔人所说的,在这种情况下是没有必要的。但是,在某些情况下,当代码过于模糊而无法推断时,有必要指定函数的类型。

出于文档目的,并且因为对于某些类型扩展,自动推断失败。阅读。

以获取文档,因为对于某些类型扩展,自动推断失败。阅读。

该行是否生成实际代码(如某些运行时类型检查?我对Haskell完全不熟悉。)您应该将其作为提示阅读给编译器(这可能会或可能不会根据这些提示更改生成的代码)-如果您不给它,编译器将尝试推断“您是对的,它们绝对没有必要”在这种情况下。有几种情况下,如果你留下打字签名并吐出几页模棱两可的错误,GHC会对你大喊大叫。@Johnson Steward:不!Haskell是静态类型的,所有类型都在编译时解析。无论您是告诉编译器类型是什么(使用这样的类型签名),还是让编译器自己(通过类型推断),生成的代码都是相同的。(一个例外:如果你给代码一个更具体的类型,那么编译器可能会生成不同的输出。)进一步阅读,发现:
zipWith'::(a->b->c)->[a]->[b]->[c]
。对于编译器来说,这似乎不容易推断……这一行是否会生成实际代码(比如一些运行时类型检查?我对Haskell完全陌生。)您应该将其作为提示阅读给编译器(这可能会或可能不会根据这些提示更改生成的代码)-如果您不给出,编译器将尝试推断它“你是对的,它们绝对没有必要。”在这种情况下。如果你留下类型签名并吐出几页歧义错误,GHC会对你大喊大叫。@Johnson Steward:不!Haskell是静态类型的,所有类型都在编译时解析。不管你是否告诉编译器类型是什么(使用这样的类型签名),或者让编译器自己计算出来(通过类型推断),生成的代码是相同的。(一个例外:如果给代码一个更具体的类型,编译器可能会生成不同的输出。)进一步阅读,发现:
zipWith'::(a->b->c)->[a]->[b]->[c]
。对于编译器来说,这似乎不容易推断……相关:相关:1.链接已断开。2.目前,您的答案几乎是只包含链接的答案。请在答案本身中添加更多信息。@Zeta 2同意,但1个链接未断开。@Johnson Steward:在前五分钟进行忍者编辑。是的,我在第一次合作后进行了忍者编辑嗯。顺便说一句,我认为这个链接对哈斯凯尔初学者来说是一个很好的解释。1.链接断开了。2.目前,你的答案几乎是一个只包含链接的答案。在答案中添加更多信息。@Zeta 2同意,但1个链接没有断开。@Johnson Steward:在前五分钟进行忍者编辑。是的,我在第一次合作后进行了忍者编辑顺便说一句,我认为这个链接对haskell初学者有很好的解释。