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

Dart中实现Functor的fmap时typedef报错的正确语法是什么

错误原因

你编写的Fmap类型别名不符合Dart语法规范,核心问题有两点:

  • Dart函数类型的固定格式为返回值类型 Function(参数1类型, 参数2类型...),不存在「返回值放括号里、参数单独放后面括号」的C风格函数签名写法
  • 柯里化函数的类型需要按调用顺序嵌套,你之前的写法括号位置完全错乱,编译器无法识别类型结构
正确写法

你定义的F<A>类型别名是合法的,对应Functor的fmap正确类型定义如下,完全匹配Haskell、TS中的签名逻辑:

typedef F<A> = Map<String, A>;
// 柯里化顺序:先接收A->B的映射函数,再接收F<A>实例,最终返回F<B>
typedef Fmap<A, B> = F<B> Function(F<A>) Function(B Function(A) mapper);

类型结构对应关系:

  1. 最外层... Function(B Function(A) mapper):对应fmap第一个入参是A -> B的转换函数
  2. 中间层F<B> Function(F<A>):传入转换函数后返回的新函数,入参为F<A>类型
  3. 最内层F<B>:函数最终返回值为映射后的F<B>类型
可运行实现示例

搭配以下实现可以直接验证逻辑:

typedef F<A> = Map<String, A>;
typedef Fmap<A, B> = F<B> Function(F<A>) Function(B Function(A) mapper);

// fmap具体实现:遍历Map对所有value应用映射函数
Fmap fmap = <A, B>(B Function(A) mapper) {
  return (F<A> sourceMap) {
    return sourceMap.map((key, value) => MapEntry(key, mapper(value)));
  };
};

void main() {
  // 测试用例
  F<int> intMap = {"age": 18, "score": 95, "level": 3};
  String Function(int) addPrefix = (num) => "val_$num";
  
  // 柯里化调用
  F<String> result = fmap(addPrefix)(intMap);
  print(result); // 输出:{age: val_18, score: val_95, level: val_3}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:39:42