是否存在任何编程语言(或类型系统),您可以在其中以静态类型和类型安全的方式表达以下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()
答案 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中,迭代器对象的类型是它们是迭代器。如果你的意思是他们返回,他们返回迭代器。我不明白为什么在静态系统中这是不可能的,但也许我错过了一些东西。