让我们考虑以下Haskell程序:
g::Int
g = 300
func::Int->Int
func arg = arg + g
main = do
print (func 4)
我并不特别喜欢这个程序,因为" func"在其计算中使用了全局变量G需要执行必要的计算(即使用函数以外的任何内容) 。
我的问题是:有没有办法让GHC拒绝使用参数列表中未定义的变量的函数?(而不是必须依靠纯纪律)...
[编辑]:也请考虑以下内容:
main.hs:
import MyMod
func::Int->Int
func arg = arg + g
main = do
print (func 4)
mymod.hs
module MyMod where
g::Int
g = 300
[edit2]:我猜如果函数只能使用参数列表中定义的变量,那么人们将不得不为:
这样的事物做例外(?)g::Int
g = 300
h::Int
h = 400
i::Int
i = g + h
[edit3]:对于N.M.响应"尝试编写具有多个函数的限制的完整程序"(限制是函数只能在其参数列表中声明的变量)。当然,必须有例外,在这种情况下,主要是例外。此示例是根据比较haskell和C的速度来计算prime
的。divisibleRec :: Int -> Int -> Bool
divisibleRec i j
| j == 1 = False
| i `rem` j == 0 = True
| otherwise = divisibleRec i (j-1)
divisible::Int->(Int -> Int -> Bool)-> Bool
divisible i fn= (fn i (i-1))
main :: IO()
main = print(length([ x | x <- [2..1000], (divisible x divisibleRec) == False]))
[EDIT 4]:关于Edit3中的程序,递归用法也像Divisiblerec中一样是一个例外,因为内部的" Divisiblerec"不作为对函数的参数。
。当我们将许多功能链接在一起时,此规则也无法实现。在上面的程序中还不错,我们只有"可划分的x Divisiblerec",但是随着我们有更大的程序,上面的计划变得无可奈何,因为我们有效地必须将所有功能链接在一个地方....
。[编辑5]:当我最初发布此问题时,我正在以不同级别查看功能和变量。但是,当您将功能与变量相同的级别处理时,因此限制"我程序中写入的所有函数都将执行必要的计算所需的所有元素指定为参数(即使用函数之外的任何函数)"表示使用的功能其他函数必须作为参数传递,然后由于Edit4中提到的原因,整个方法变得无法实现。
从理论上讲,您可以使用无免费变量的组合逻辑(从功能外部捕获的lambda-terms)(这就是您的请求在lambda ccleculus方面的表达方式),但必须它像深奥的编程语言一样,非常不可行和笨拙。
如评论中指出的那样,任何"值"都是一个函数(即使没有参数)。我在不使用自由变量中看到的主要障碍是任何输入/输出功能都在您的功能外部,因此纯组合程序不能做任何IO,甚至比Haskell本身更无用(SPJ说Haskell是Haskell是毫无用处:))。此外,您没有任何库功能,这仅对某些数学练习可能有用,而不是编程。
另一个问题是在某些功能子集中是否可以在本地进行本地,但我怀疑GHC或任何其他Haskell实现都可以。
组合性逻辑口译员有一些实现,但我没有努力使Haskell Pure Compination。
结论:这个问题却属于语言设计领域和基本数学形式主义的选择。Haskell(基于具有自由变量的Lambda微积分)绝对与您想要的不同。向Haskell引入此类限制将使它成为另一种语言,尽管您可以在代码中观察纪律以使其部分组合。在数学上介绍限制自由"值"(无差异函数)是毫无意义的,因此这样做的内置机制很不可能。