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

Python 如何使这些动态类型的函数类型安全?,python,language-agnostic,type-theory,Python,Language Agnostic,Type Theory,是否有任何编程语言(或类型系统)可用于以静态类型化和类型安全的方式(无需使用强制转换、运行时检查等)表达以下Python函数 #1: #2: 对于示例#1,必须指定Apply()的返回类型,然后传递的所有函数x也必须返回该类型。大多数静态类型语言在没有检查的情况下都无法安全地执行此操作,因为传入的x函数可以返回任何结果 在示例2中,迭代器对象的类型是迭代器。如果你的意思是他们返回什么,他们返回迭代器。我不明白为什么在静态系统中不可能做到这一点,但也许我遗漏了一些东西。1 这不能用有限类型进行键入

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

#1

#2

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

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

1 这不能用有限类型进行键入。这意味着很少有编程语言(如果有的话)能够输入这种类型

但是,正如您所演示的,x有一种特定类型,允许键入函数:

x :: t -> B
其中
B
是某种具体类型。这导致
apply
被键入为:

apply :: (t -> B) -> B
请注意,Hindley Milner不会派生此类型

2#
这在Haskell中很容易表达(留给读者作为练习…

我发现了一个Haskell解决方案,用于#1使用(仅用于GHCi)


迭代器也是泛型的,因为您需要知道它包含的值的类型(迭代器)?为什么?你需要知道它们返回什么,在这种情况下,它们返回另一个迭代器。等等,你的意思是我们不能确定迭代器,迭代器返回的是迭代器,这是真的。简而言之,不,在静态语言中,如果使用泛型函数并传递它们,那么不,您不知道它们返回什么。事实上,当您最终需要动态功能时,这通常是在静态语言中执行的操作不你为什么这么认为?这些应该在两个独立的问题中。他们在同一个问题上的后果是显而易见的,因为下面的大多数答案都涉及其中一个,但不是两个。所以收盘太宽了。围棋应该能做到。Java8也是,iirc.To#2:你能举个具体的例子吗?我认为可以用一种完全不同的方式(monad/continuations)在Haskell中实现这一点,但是键入迭代器不是与#1中相同的问题吗?
x :: t -> B
apply :: (t -> B) -> B
{-# LANGUAGE RankNTypes #-}
apply :: (forall a . a -> r) -> r
apply x = x x

apply $ const 42 -- Yields 42