Unison中map调用Text.size报错,求原因及解决方法
解决Unison中
size x在映射函数里的类型歧义问题 这是个典型的类型推断歧义问题,我来帮你拆解一下原因和解决办法:
为什么直接调用size "字符串"没问题,但map (x -> size x) foo报错?
当你写size "foobar"时,Unison能立刻从字面量"foobar"推断出参数是Text类型,所以会自动匹配唯一对应的.base.Text.size函数,不会有歧义。
但在map (x -> size x) foo这个场景里:
foo确实是[Text]类型,但Unison在分析匿名函数x -> size x的时候,会先单独评估这个函数的类型:它需要一个输入类型a,输出Nat,而全局作用域里有多个size函数(比如List.size、Bytes.size等)都符合a -> Nat的签名。- 虽然最终
map会把这个函数应用到Text元素上,但Unison的类型推断顺序导致它没法提前确定你要的是Text.size,所以抛出了歧义错误。
几种解决方法
你可以任选一种来消除歧义:
直接指定
size的完整引用
明确告诉Unison你要用Text模块下的size:> map (x -> .base.Text.size x) foo给匿名函数的参数加类型注解
给x标注Text类型,让Unison知道size的参数类型,从而匹配正确的函数:> map ((x : Text) -> size x) foo提前绑定专属的
size别名
如果你后续会多次用到Text.size,可以先把它绑定到当前作用域的size上:> size = .base.Text.size > map (x -> size x) foo
这样就能顺利得到预期的[3,6,1,3]结果啦!
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

