这不是一个问题,而是一个沉思......我写了一个程序来测试'std :: bind'如何将参数传递给被绑定的函数.在这种情况下,C++编译器似乎执行静态类型检查:
#include <iostream>
#include <functional>
void take_int(const int *a)
{
if (a)
{
std::cout << "a is " << *a << std::endl;
}
else
{
std::cout << "null" << std::endl;
}
}
int main()
{
int *a = new(int);
*a = 4;
take_int(NULL); //prints 'null'
auto fn = std::bind(take_int, NULL); //fails to compile
fn();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
似乎不一致的是能够直接用NULL调用该函数,但是在编译时它通过std :: bind失败了.
我猜std :: bind正在使用更现代的C++功能选择强制执行此操作?
我一直在努力学习哈斯克尔的书,学习自己一个哈克尔.本书涵盖take了以下方式的实现:
take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
| n <= 0 = []
take' _ [] = []
take' n (x:xs) = x : take' (n-1) xs
Run Code Online (Sandbox Code Playgroud)
我对这段代码有两个问题:
在函数声明中我们为什么要使用相同的字母i来声明(Num i, Ord i)?这难道不是覆盖的事实,i是类型Num与i类型是Ord?
我想修改,take'以便如果n大于列表的长度,则打印出一条消息.我试图通过使用定义中的函数长度来实现这个'但是然后函数无法加载:
拿'n _
| n > length _ = print "n greater than length of list"
Run Code Online (Sandbox Code Playgroud)