Haskell中的函数模式匹配

Joh*_*ard 0 haskell

我正在尝试学习Haskell在学习你是一个Haskell的指导,但以下困惑我.

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

正如您所看到的,那里有一行说明函数的确切类型.但这有必要吗?参数和返回值的类型不能从该行下面的模式中推导出来吗?

mad*_*jar 6

你是对的,绝对没有必要.但是,由于至少有两个原因,这是一种非常常见的做法,即说明功能的类型:

  • 告诉编译器你的意思是什么.如果您在编写函数时出错,编译器将不会推断出错误类型,但会警告您错误
  • 告诉读取您代码的人.在理解代码时,他们必须找出函数的类型,所以你不妨让它们更容易.明确地使类型使代码更具可读性.

这就是为什么尽管它们是可选的,但顶级函数的类型几乎总是在Haskell代码中拼写出来.


为了完成Zeta所说的,在这种情况下没有必要.但是,在某些情况下,当代码太不明确而无法推断时,有必要指定函数的类型.

  • @JohnsonSteward:没有!Haskell是静态类型的,所有类型都在编译时解析.无论你告诉编译器类型是什么(具有类似的类型签名),或者让编译器为自己弄清楚(通过类型推断),生成的代码都是相同的.(一个例外:如果你给代码一个*更具体的*类型,那么编译器可能会产生不同的输出.) (2认同)