在haskell中调用函数

时间:2011-09-04 14:45:37

标签: haskell

我是Haskell编程的新手。我想调用一些函数并将结果保存在变量中,但我不知道如何。我在两本不同的书中读了几章有关haskell功能的章节,但仍然不明白该怎么做。

import Data.Map (Map)
import qualified Data.Map as M hiding (Map)

newtype GenEnv elt = Env (Map Id elt)

newEnv :: GenEnv elt                             -- initialise
newEnv = Env M.empty
newtype GenEnv elt = Env (Map Id elt)

newEnv :: GenEnv elt                             -- initialise
newEnv = Env M.empty

getEnv :: GenEnv elt -> Id -> Maybe elt          -- G(x) (key function)
getEnv (Env env) var = M.lookup var env

union  :: GenEnv elt -> (Id,elt) -> GenEnv elt    -- G[x:v]
union  (Env env) (key,elt) = Env (M.insert key elt env)

-- foldr is faster than addToFM_list!
unionL :: GenEnv elt -> [(Id,elt)] -> GenEnv elt -- list union
unionL (Env env) pairs  = Env $ foldr (\(k,e) g -> M.insert k e g) env pairs

我在这里要求的不是某人做我的工作,而是询问如何调用这些函数,因为我不理解他们的签名。

4 个答案:

答案 0 :(得分:2)

正如其他人所说,“变量”可能不是正确的术语。同样,“召唤”一个功能也许也不是正确的术语。在我看来,从数学函数的角度思考这个问题很有帮助:

f(x) = x^2

给定上面的函数,你不要用一个值“调用”它,而是给在特定参数上评估该函数的结果命名:

y = f(2)

在Haskell中也是如此。在代码中的某处,您需要使用在特定值处评估函数的结果。为此,您可以在任何需要的地方使用该函数的应用程序,或者将其绑定到let绑定或where子句中的名称。

因此,为了在Haskell中提供一个简单的例子,你可以这样做:

f :: Int -> Int
f x = x^2

y :: Int
y = f 2

g :: Int -> Int
g x = let y = f 3
      in y + 1

h :: Int -> Int
h x = y + 1
        where y = f 3

这里我已经声明了一个名为f的函数,它接受一个Int值并返回一个新的Int值,即参数的平方。然后我声明了一个名为Int的{​​{1}}值是将y应用于f的结果。值2不是变量,而是绑定。它始终是y

然后我宣布了两个等价的其他函数4g,显示了应用h结果的局部绑定。

在您的示例中,类型可能会使事情变得复杂一些。 f是用于构造Env类型值的构造函数。因此,要创建Genenv类型的值,请将Genenv应用于适当的参数。这就是Env正在做的事情。

希望这足以让你开始。

答案 1 :(得分:1)

由于我非常想解释这些事情,我建议阅读本章

http://book.realworldhaskell.org/read/types-and-functions.html

应该包含您需要知道的能够调用这些功能的所有内容。

通常在Haskell中,我们将函数应用于某些参数,并将结果绑定到某个值。

答案 2 :(得分:0)

首先,Haskell没有变量。通常我们谈到将表达式绑定到标识符,创建一个thunk。

它具有

的形式
let val = unionEl g l
in --expression using val

答案 3 :(得分:0)

在Haskell中,函数的应用是通过并置完成的,但是您可以首先使用括号来获得它的感觉,只是不要使用逗号来分隔参数,就像您可能习惯于其他语言一样。

例如,假设Id只是Int的类型同义词,那么下面将以GenEnv为例。

example :: GenEnv Char 
example = union newEnv (1, 'a') 

相同
example :: GenEnv Char 
example = union(newEnv (1, 'a')) 

假设您有一个与整数值关联的字母列表,alphabetKeys,您可以使用定义的便捷小工具,只需

即可轻松将其转换为GenEnv
example :: GenEnv Char
example = union newEnv alphabetKeys
再次

 example :: GenEnv Char 
 example = union(newEnv alphabetKeys) 

同样会工作。