如何使这些动态类型的函数类型安全?

时间:2009-07-03 12:22:23

标签: python language-agnostic type-theory

是否存在任何编程语言(或类型系统),您可以在其中以静态类型和类型安全的方式表达以下Python函数(无需使用强制转换,运行时检查等)?

#1

# My function - What would its type be? 
def Apply(x):
    return x(x)

# Example usage
print Apply(lambda _: 42)

#2

white = None
black = None

def White():
    for x in xrange(1, 10):
        print ("White move #%s" % x)
        yield black

def Black():
    for x in xrange(1, 10):
        print ("Black move #%s" % x)
        yield white

white = White()
black = Black()

# What would the type of the iterator objects be?
for it in white:
    it = it.next()

3 个答案:

答案 0 :(得分:4)

<强> 1# 这不是有限类型的可输入。这意味着很少(如果有的话)编程语言能够输入它。

但是,正如您所演示的那样,x的特定类型允许输入函数:

x :: t -> B

B是某种具体类型。这导致apply被输入为:

apply :: (t -> B) -> B

请注意,Hindley-Milner不会派生此类型。

<强> 2# 这很容易在Haskell中表示(留给读者的练习......)

答案 1 :(得分:2)

我使用Rank-N-Types找到了#1 的Haskell解决方案(仅适用于GHCi)

{-# LANGUAGE RankNTypes #-}
apply :: (forall a . a -> r) -> r
apply x = x x

apply $ const 42 -- Yields 42

答案 2 :(得分:0)

当谈到示例#1时,您必须指定Apply()的返回类型,然后您传递的所有函数x也必须返回此值。大多数静态类型语言在没有检查的情况下无法安全地执行此操作,因为您传入的x函数可以返回任何内容。

在示例#2中,迭代器对象的类型是它们是迭代器。如果你的意思是他们返回,他们返回迭代器。我不明白为什么在静态系统中这是不可能的,但也许我错过了一些东西。