33 lines
		
	
	
		
			732 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			732 B
		
	
	
	
		
			V
		
	
	
// Function signatures can be declared as types:
 | 
						|
 | 
						|
type Filter = fn (string) string
 | 
						|
 | 
						|
// Functions can accept function types as arguments:
 | 
						|
 | 
						|
fn filter(s string, f Filter) string {
 | 
						|
	return f(s)
 | 
						|
}
 | 
						|
 | 
						|
// Declare a function with a matching signature:
 | 
						|
 | 
						|
fn uppercase(s string) string {
 | 
						|
	return s.to_upper()
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
	// A function can be assigned to a matching type:
 | 
						|
 | 
						|
	my_filter := Filter(uppercase)
 | 
						|
 | 
						|
	// You don't strictly need the `Filter` cast - it's only used
 | 
						|
	// here to illustrate how these types are compatible.
 | 
						|
 | 
						|
	// All of the following prints "HELLO WORLD":
 | 
						|
 | 
						|
	println(filter('Hello world', my_filter))
 | 
						|
	println(filter('Hello world', uppercase))
 | 
						|
	println(filter('Hello world', fn (s string) string {
 | 
						|
		return s.to_upper()
 | 
						|
	}))
 | 
						|
}
 |