You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,所以抛出了歧义错误。

几种解决方法

你可以任选一种来消除歧义:

  1. 直接指定size的完整引用
    明确告诉Unison你要用Text模块下的size:

    > map (x -> .base.Text.size x) foo
    
  2. 给匿名函数的参数加类型注解
    给x标注Text类型,让Unison知道size的参数类型,从而匹配正确的函数:

    > map ((x : Text) -> size x) foo
    
  3. 提前绑定专属的size别名
    如果你后续会多次用到Text.size,可以先把它绑定到当前作用域的size上:

    > size = .base.Text.size
    > map (x -> size x) foo
    

这样就能顺利得到预期的[3,6,1,3]结果啦!

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:53:11