我是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
我在这里要求的不是某人做我的工作,而是询问如何调用这些函数,因为我不理解他们的签名。
答案 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
。
然后我宣布了两个等价的其他函数4
和g
,显示了应用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
,您可以使用定义的便捷小工具,只需
example :: GenEnv Char
example = union newEnv alphabetKeys
再次
example :: GenEnv Char
example = union(newEnv alphabetKeys)
同样会工作。