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);
类型结构对应关系:
- 最外层
... Function(B Function(A) mapper):对应fmap第一个入参是A -> B的转换函数 - 中间层
F<B> Function(F<A>):传入转换函数后返回的新函数,入参为F<A>类型 - 最内层
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
相关产品推荐
相关产品推荐

