可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Is there any programming language (or type system) in which you could express the following Python-functions in a statically typed and type-safe way (without having to use casts, runtime-checks etc)?
#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()
回答1:
1# This is not typeable with a finite type. This means that very few (if any) programming languages will be able to type this.
However, as you have demonstrated, there is a specific type for x that allows the function to be typed:
x :: t -> B
Where B is some concrete type. This results in apply being typed as:
apply :: (t -> B) -> B
Note that Hindley-Milner will not derive this type.
2# This is easy to represent in Haskell (left as an exercise to the reader...)
回答2:
I found a Haskell solution for #1 using Rank-N-Types (just for GHCi)
{-# LANGUAGE RankNTypes #-} apply :: (forall a . a -> r) -> r apply x = x x apply $ const 42 -- Yields 42
回答3:
When it comes to example #1, you would have to specify the return type of Apply(), and then all functions x that you pass also must return this. Most statically typed languages would not be able to do that safely without checks, as the x function you pass in can return whatever.
In example #2 the type of the iterator objects are that they are iterators. If you mean what they return, they return iterators. I don't see why that wouldn't be possible in a static system, but maybe I'm missing something.