
Subscribe to demian

Subscribe to demian
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
程序由:声明和表达式构成 值 、 变量、类型 注释: /* */ , //
mo语法说明
表达式分割:空格,逗号(用在元组或数组上),分号
变量名 x foo_bar test132, list ,Map
圆括号(1+2)*3 ()=》空元组,Unit类型,(1,2) =》元组
花括号 object {a=1,b=2} ob可以省略
类型标注 func f(x:Nat) : Nat { let y = x+1 ; x+y} func是声明一个函数, x是参数,参数类型是Nat,Nat是整数里面的正整数, 返回类型Nat,函数体
ignore
报错: type error [M0060], operator is not defined for operand types Text
值、类型、类型推断、类型检查
值域 vs. 类型域
import Blob "mo:base/blob";
type Blob = Blob.Blob; 声明的Blob类型,并定义本地的Blob类型
let Blob = "Blob"; => 和上面的Blob类型冲突, 值域里只能有一个
类型代表了静态语义, 类型检查让代码更安全 ,类型标注可以帮助类型推断
var seed : [ var Nat8] = [ var 0,0,0,0,0,0,0,0,0,0,0];
var Nat8=》 类型标注
基础类型
布尔类型 Bool 自然数 Nat Nat8 Nat16 Nat32 Nat64 => 都是整数 整数 Int,Int8,Int16,Int32,Int64 浮点数 Float 仅支持64位 字符串 Text 字符 Char 和canister相关的类型: PrincipalBlob 一连串的字节 None 空集,也是一个类型 Error 异步抛出的异常
组合类型 Record =》记录结构
let person = { name = "kkdemian"; age = 67; };
func f() : {name: Text; age: Nat}{ person } 枚举(Variant)
type Gender = { #male; #femalel }
let person = { name = "kkdemian"; age = 67; gender = #male; };
func f() : { name: Text; age: Nat}{ person };
let g = f().gender;
元组(tuple)是记录结构(record)的特殊形式
let x: (Int,Bool) = (10,false);
let y : Bool = x.1; 读取x的第一项 ; =》 y = false
模式匹配(pattern match)
type Gender = { #malel #female; #unspecified: {retire_age :Nat }; // 记录结构 }
type Person = { name:Text; age : Nat; gender: Gender; }; // 枚举类型
// 返回一个bool func retired(person:Person): Bool { // 模式匹配 任意枚举类型都可以匹配 switch(person.gender){ case (#male) (person.age >= 60); case (#female) (person.age >= 55); case (#unspecified({retire_age})) (person.age >= retire_age); }};
Option 和Result
// 可以有返回Bool 或不返回 // 空的分支 使用null func retired(person: Person) : ?Bool { switch(person.gender){ case (#male) ?(person.age >= 60); // bool值转换为option类型 case (#female) ?(person.age >= 55); case (#unspecified) null; } } // Option 类型: ?Bool ,?Nat ... Optio 值: null, ?true , ?12 ...
Result 类型 : Result <R,E> Result 值: #ok(true), #err("Unknown")
//在成功失败的时候都可以有返回值
// 定义类型, <> 表示类型变量 , 使用的时候指定类型 type Result<Ok, Err> = { #ok: Ok; #err: Err; };
// import Result "mp:base/Result"; // type Result<R,E> = Result.Result<R,E>;
func retired(person:Person) : Result<Bool,Text> { switch(person.gender){ case (#male) #ok(person.age >= 60); case (#female) #ok(person >= 55); case (#unspecified) #err("Unknown"); } }
函数:从定义域(domain)到值域(range)的映射关系
类型: () -> Result<Bool,Text> 定义域是空元组(tuple), 返回值是Bool,Text
()->(), 定义域是空元组,返回值也是空元组 , canister 修改局部变量,发消息
函数定义
// 接受参数 func dec(a:Int) : Int { a -1 }; func ind(a:Nat) : Nat { a + 1};
匿名函数
// 需要在两边给类型,不然无法进行类型推断
// 声明变量的时候给类型 let dec : Int -> Int = func (a) { a - 1};
let inc = func (a:Nat) :Nat{ a + 1 } ;
高阶函数
From “mo:base/Array”; //定义函数 init , 类型参数, 声明值域类型的类型变量 // 数组中每一个元素必须是A的类型 public func init(size: Nat, initVal: A ) : [var A]{ Prim.Array_init(size,initVal); } // gen: Nat -> A 函数参, 类型从Nat 到A public func tabulate(size:Nat , gen: Nat -> A): [A]{ Prim.Array_tabulate(size,gen); } // 使用 // arr = [ var 42,42,42,42,42]: [var Int] let arr = Array.init(5,42); // brr = [0,1,2,3, ... , 99] : [Nat] let brr = Array.tabulate(100,func(i){i}); // crr = [0,2,4,... ,198]: [Int] // 整数 let crr = Array.tabulate(100,func(i){ i * 2}) ; Object(对象) 类似记录结构 // 成员需要标注类型, 默认是private object counter { var count = 0 ; // 可以使用当前声明的变量 public func inc() { count + 1} ; public fun read() : Nat { count }; public func bump() :Nat{ inc(); read() }; }; type Counter = { inc : () -> (); read : () -> Nat; bump : () ->Nat; }; //counter 是Counter 的类型 let counter : Counter = object{ var count = 0; public func inc(){ count +1 }; public func read() : Nat{ count }; public func bump() : Nat{ inc(); read() }; }; // 记录结构表示 Counter // 记录结构所有的成员都是public let counter : Counter = do{ // 声明三个变量 var count = 0; let inc = func () { count +1 }; let read = func () : Nat{ count }; // 声明一个记录结构 { inc = inc ; read = read ; // 匿名函数 bump = func () : Nat{ inc() ; read() }; } }; Actor 声明 特殊的obj , 是一种canister actor Counter { var count = 0; public shared func inc() : async () { count +1 }; // 定义读取方法, 只能通过异步调用 public shared func read() : async Nat{ count }; public shared func bump() : async Nat{ count +1 ; count ; }; }; type Counter = actor { inc : shared () -> async(); read : shared () -> async Nat; bump : shared () -> async Nat; } // 异步调用 // 默认是update call ,声明后才是query actor Counter { var count = 0; public shared func inc() : async () { count +1 }; public shared func query read() : async Nat{ count }; public shared func bump() : async Nat{ await inc(); // 不能保证函数的原子性 await read(); }; }; // 调用的时候可以区分方法是update 还是call 声明的时候需要 type Counter = actor { inc : shared () -> async() ; read : shared query() -> async() Nat; bump : shared () -> async Nat; }
程序由:声明和表达式构成 值 、 变量、类型 注释: /* */ , //
mo语法说明
表达式分割:空格,逗号(用在元组或数组上),分号
变量名 x foo_bar test132, list ,Map
圆括号(1+2)*3 ()=》空元组,Unit类型,(1,2) =》元组
花括号 object {a=1,b=2} ob可以省略
类型标注 func f(x:Nat) : Nat { let y = x+1 ; x+y} func是声明一个函数, x是参数,参数类型是Nat,Nat是整数里面的正整数, 返回类型Nat,函数体
ignore
报错: type error [M0060], operator is not defined for operand types Text
值、类型、类型推断、类型检查
值域 vs. 类型域
import Blob "mo:base/blob";
type Blob = Blob.Blob; 声明的Blob类型,并定义本地的Blob类型
let Blob = "Blob"; => 和上面的Blob类型冲突, 值域里只能有一个
类型代表了静态语义, 类型检查让代码更安全 ,类型标注可以帮助类型推断
var seed : [ var Nat8] = [ var 0,0,0,0,0,0,0,0,0,0,0];
var Nat8=》 类型标注
基础类型
布尔类型 Bool 自然数 Nat Nat8 Nat16 Nat32 Nat64 => 都是整数 整数 Int,Int8,Int16,Int32,Int64 浮点数 Float 仅支持64位 字符串 Text 字符 Char 和canister相关的类型: PrincipalBlob 一连串的字节 None 空集,也是一个类型 Error 异步抛出的异常
组合类型 Record =》记录结构
let person = { name = "kkdemian"; age = 67; };
func f() : {name: Text; age: Nat}{ person } 枚举(Variant)
type Gender = { #male; #femalel }
let person = { name = "kkdemian"; age = 67; gender = #male; };
func f() : { name: Text; age: Nat}{ person };
let g = f().gender;
元组(tuple)是记录结构(record)的特殊形式
let x: (Int,Bool) = (10,false);
let y : Bool = x.1; 读取x的第一项 ; =》 y = false
模式匹配(pattern match)
type Gender = { #malel #female; #unspecified: {retire_age :Nat }; // 记录结构 }
type Person = { name:Text; age : Nat; gender: Gender; }; // 枚举类型
// 返回一个bool func retired(person:Person): Bool { // 模式匹配 任意枚举类型都可以匹配 switch(person.gender){ case (#male) (person.age >= 60); case (#female) (person.age >= 55); case (#unspecified({retire_age})) (person.age >= retire_age); }};
Option 和Result
// 可以有返回Bool 或不返回 // 空的分支 使用null func retired(person: Person) : ?Bool { switch(person.gender){ case (#male) ?(person.age >= 60); // bool值转换为option类型 case (#female) ?(person.age >= 55); case (#unspecified) null; } } // Option 类型: ?Bool ,?Nat ... Optio 值: null, ?true , ?12 ...
Result 类型 : Result <R,E> Result 值: #ok(true), #err("Unknown")
//在成功失败的时候都可以有返回值
// 定义类型, <> 表示类型变量 , 使用的时候指定类型 type Result<Ok, Err> = { #ok: Ok; #err: Err; };
// import Result "mp:base/Result"; // type Result<R,E> = Result.Result<R,E>;
func retired(person:Person) : Result<Bool,Text> { switch(person.gender){ case (#male) #ok(person.age >= 60); case (#female) #ok(person >= 55); case (#unspecified) #err("Unknown"); } }
函数:从定义域(domain)到值域(range)的映射关系
类型: () -> Result<Bool,Text> 定义域是空元组(tuple), 返回值是Bool,Text
()->(), 定义域是空元组,返回值也是空元组 , canister 修改局部变量,发消息
函数定义
// 接受参数 func dec(a:Int) : Int { a -1 }; func ind(a:Nat) : Nat { a + 1};
匿名函数
// 需要在两边给类型,不然无法进行类型推断
// 声明变量的时候给类型 let dec : Int -> Int = func (a) { a - 1};
let inc = func (a:Nat) :Nat{ a + 1 } ;
高阶函数
From “mo:base/Array”; //定义函数 init , 类型参数, 声明值域类型的类型变量 // 数组中每一个元素必须是A的类型 public func init(size: Nat, initVal: A ) : [var A]{ Prim.Array_init(size,initVal); } // gen: Nat -> A 函数参, 类型从Nat 到A public func tabulate(size:Nat , gen: Nat -> A): [A]{ Prim.Array_tabulate(size,gen); } // 使用 // arr = [ var 42,42,42,42,42]: [var Int] let arr = Array.init(5,42); // brr = [0,1,2,3, ... , 99] : [Nat] let brr = Array.tabulate(100,func(i){i}); // crr = [0,2,4,... ,198]: [Int] // 整数 let crr = Array.tabulate(100,func(i){ i * 2}) ; Object(对象) 类似记录结构 // 成员需要标注类型, 默认是private object counter { var count = 0 ; // 可以使用当前声明的变量 public func inc() { count + 1} ; public fun read() : Nat { count }; public func bump() :Nat{ inc(); read() }; }; type Counter = { inc : () -> (); read : () -> Nat; bump : () ->Nat; }; //counter 是Counter 的类型 let counter : Counter = object{ var count = 0; public func inc(){ count +1 }; public func read() : Nat{ count }; public func bump() : Nat{ inc(); read() }; }; // 记录结构表示 Counter // 记录结构所有的成员都是public let counter : Counter = do{ // 声明三个变量 var count = 0; let inc = func () { count +1 }; let read = func () : Nat{ count }; // 声明一个记录结构 { inc = inc ; read = read ; // 匿名函数 bump = func () : Nat{ inc() ; read() }; } }; Actor 声明 特殊的obj , 是一种canister actor Counter { var count = 0; public shared func inc() : async () { count +1 }; // 定义读取方法, 只能通过异步调用 public shared func read() : async Nat{ count }; public shared func bump() : async Nat{ count +1 ; count ; }; }; type Counter = actor { inc : shared () -> async(); read : shared () -> async Nat; bump : shared () -> async Nat; } // 异步调用 // 默认是update call ,声明后才是query actor Counter { var count = 0; public shared func inc() : async () { count +1 }; public shared func query read() : async Nat{ count }; public shared func bump() : async Nat{ await inc(); // 不能保证函数的原子性 await read(); }; }; // 调用的时候可以区分方法是update 还是call 声明的时候需要 type Counter = actor { inc : shared () -> async() ; read : shared query() -> async() Nat; bump : shared () -> async Nat; }
No activity yet