Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

类型推断

(Type Inference)

Koka是强类型的。它使用强大的类型推断引擎来推断大多数类型。 你始终可以在任何局部变量声明时省略其类型标注:

fun main()
  var a:=10 // 类型推断为int,等效于var a:int:=10
  println(a)

你也可以省略函数参数和结果的类型标注:

import std/num/int32
fun rotl(a)
  rotl(a,10) // 对形参a能使用i32的rotl则将a类型推断为i32
  // int 是平台相关整数——在 32 位平台上等同于 int32,在 64 位平台上等同于 int64,宽度由编译目标决定
fun main()
  rotl(100.i32) // int不会被隐式转换成int32,必须显式转换

但一般来说,为函数参数和函数结果编写类型标注是一种很好的做法,因为它既有助于类型推断,又提供有用的文档以及来自编译器的更好的反馈。

示例代码:

//移位变换加密
fun encode(s : string, shift : int)
  fun encode-char(c)
    if c < 'a' || c > 'z' then return c
    val base = (c - 'a').int
    val rot  = (base + shift) % 26
    (rot.char + 'a')
  s.map(encode-char)
//恺撒密码加密代换
fun caesar( s : string ) : string
  s.encode( 3 )
fun main()
  caesar("foobarbaz")

对于此处的 encode 函数,不能省略 s 参数的类型:因为 map 函数是为列表和字符串类型定义的,没有类型标注不能确定 s 是列表还是字符串,从而编译时无法确定用哪一个签名的函数。
尝试在编辑器中示例的删除 s 的类型标注后运行以查看Koka编译器会报什么错误。