ocaml - OCaml:为什么`let f : int -> int list -> int list = (::);;` 会失败?
问题描述
我认为 OCaml 会阅读
let f : int -> int list -> int list = (::);;
作为部分应用程序的实例,并将函数存储为f
. 但是,编译器抱怨该函数应用于太少的参数。任何对此的见解将不胜感激,谢谢。
解决方案
OCaml 中的值::
是构造函数而不是通用函数。因此,它需要以下参数(在括号中)。您可以在(::)
表单中使用它,但它必须后跟括号中的两个值:
# ( :: ) (3, []);;
- : int list = [3]
其他构造函数也是如此,例如 say Some
:
# let f : 'a -> 'a option = Some
Error: The constructor Some expects 1 argument(s),
but is applied here to 0 argument(s)
你当然可以像这样定义你的函数:
let f : int -> int list -> int list = fun a b -> (::) (a, b)
或这个:
let f : int -> int list -> int list = fun a b -> a :: b
甚至像这样:
let f : int -> int list -> int list = List.cons
(其他语言,尤其是 Haskell,将构造函数视为函数。因此您可以部分应用构造函数等。在我看来,这在美学上更优越,即看起来更优雅。)
推荐阅读
- excel - 将工作簿上的数据复制并粘贴到已打开的工作簿中
- php - 是我的php代码可以避免sql注入吗
- c# - 用于将包含位图的参数传递给方法的结构或类
- python - 在python Django中,我想执行两个语句,如果其他,如果电子邮件被采取显示消息如果员工ID被采取显示消息
- c++ - 如何发出一个线程正确结束的信号
- node.js - 用我的脚本没有打开的 js 关闭一个标签
- sql - BigQuery 中 SQL 查询中表的每小时快照
- xcode - 为什么我上传的 IPA 二进制文件没有出现在 testflight 中?
- python - 从函数返回“任何”时,在 Python 中声明或“转换”为实际类型
- javascript - 网页版多张幻灯片滑动问题