2015-04-06 87 views
0

我在Haskell中定义函数时遇到问题。我想要做的输入EnvV类型的变量和Store类型之一,并返回一个State类型变量:Haskell函数定义

type Variable = String 
type Z = Integer 
type T = Bool 
type State = Variable -> Z 
type Location = Z 
type Store = Location -> Z 
type EnvV = Variable -> Location 

search :: EnvV -> Store -> State 
search envV store = envV(store) 
+1

类型的函数'EnvV'需要'Variable'又名'String',当你把它应用到'Store'。请详细说明你想要做什么。 – bereal 2015-04-06 09:21:56

+1

无关注:功能应用程序不需要括号(所以你应该写'envV store'而不是'envV(store)')。 – 2015-04-06 09:25:16

回答

0

尝试匹配类型:

EnvV这是Variable -> LocationStore这是Location -> Z

你想要的State,其输出是Variable -> Z

你能看到它们之间的连接?你必须消除它们之间的Location

search :: EnvV -> Store -> State 
search envV store = \x -> store (envV x) 

既然你在输出要Variable,引进x其表示。然后将其应用于envV,它会给你Location。现在将其应用于store,这将给Z。这会给你一个Variable -> Z这是你期望的类型。

这可以更简明地写:

search :: EnvV -> Store -> State 
search envV store = store . envV 
1

你的问题似乎简化为:

type State = String -> Integer 
type Store = Integer -> Integer 

search :: State -> Store -> State 

有无限多的方法来实现这一点,但我会猜测你想要的结果只是两个函数的组成。

search state store = store . state 

或者更简单地说

search = flip (.) 
0

类型

search :: EnvV -> Store -> State 

意味着

search :: EnvV -> Store -> Variable -> Z 

因此,您可以使用

search envV store var = store (envV var) 

因为envV varLocation,然后将其应用于store以产生Z

注意下面的代码是正确的,即使这是一个有点令人费解

search :: EnvV -> Store -> State 
search envV store var = store (envV var) 

它令人费解,因为它的类型显示两个参数,当下面的代码有三个。同样地,上面的代码更常被写成

search :: EnvV -> Store -> State 
search envV store = \var -> store (envV var) 

这样即使在定义中,我们可以找到两个参数和结果值实际上是State类型的每个变量var映射到其值的函数。

上面的代码可以进一步简化为使用函数组合运算符.,正如@ChrisMartin已经显示的那样。