在函数Haskell中定义变量

Bob*_*les 11 haskell

我是Haskell的新手,我实际上刚刚在10分钟前开始.我试图弄清楚如何在函数内定义变量.让我们说我有这个功能

foo :: Int -> Int
foo a = 
    b = a * 2
    b
-- Yes, I know, it doesn't do anything interesting
Run Code Online (Sandbox Code Playgroud)

当我运行它时,GHCi我得到一个语法错误!如何在函数内定义变量?

Dan*_*ner 26

有两种方法可以做到这一点:

foo a = b where b = a * 2
foo a = let b = a * 2 in b
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它们之间的选择是美学而非技术.更确切地说,where可能只附加到定义,而let ... in ...可以在允许表达的任何地方使用.双方wherelet引入块,使得在这两种情况下方便多内部变量.


Pau*_*han 3

不考虑技术正确性,答案是“某种程度上”。

我认为最好将变量视为评估给定值的零参数的函数。

module Main where
import System.IO

foo :: Integer -> Integer
foo a =
  b where
    b = a * 2

main = do
  putStrLn $ show $ foo 10
Run Code Online (Sandbox Code Playgroud)

  • 它不是零参数的函数。Haskell 中的每个函数都只接受一个参数。 (11认同)
  • 函数是具有箭头类型的值。有些值可以,有些值则不能。但如果它没有箭头类型,它就不是一个函数。 (4认同)
  • 有关 Magnus 所说的更多信息,请参阅 Conal Elliott 的博客文章 [“Haskell 中的一切都是函数”?](http://conal.net/blog/posts/everything-is-a-function-in-haskell)。 (2认同)