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

9 投票
3 回答
849 浏览
提问于 2025-04-15 12:39

有没有哪种编程语言(或者类型系统),可以让你以一种静态类型和类型安全的方式来表达以下的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

在例子 #1 中,你需要明确指定 Apply() 的返回类型,然后你传入的所有函数 x 也必须返回这个类型。大多数静态类型的编程语言在没有检查的情况下是无法安全做到这一点的,因为你传入的 x 函数可以返回任何东西。

在例子 #2 中,迭代器对象的类型就是迭代器。如果你问它们返回什么,它们返回的是迭代器。我不明白为什么在静态系统中这不可能,但也许我漏掉了什么。

2

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

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

apply $ const 42 -- Yields 42
4

1#
这段话的意思是,某些类型是无法用有限的类型来表示的。这意味着很少有(如果有的话)编程语言能够处理这种类型。

不过,正如你所展示的,x有一个特定的类型,这样这个函数就可以被正确地表示了:

x :: t -> B

这里的B是某种具体的类型。这样一来,apply的类型就变成了:

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

需要注意的是,Hindley-Milner类型系统不会推导出这个类型。

2#
在Haskell中,这个类型很容易表示(留给读者自己去练习...)

撰写回答