小编use*_*087的帖子

Haskell:列表中的每个第2个元素加倍

我刚开始使用Haskell并想编写一个函数,给定一个列表,返回一个列表,其中每个第二个元素都被加倍.

到目前为止,我已经想出了这个:

double_2nd :: [Int] -> [Int]
double_2nd [] = []
double_2nd (x:xs) = x : (2 * head xs) : double_2nd (tail xs)
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我想知道你们怎么会写这个功能.是否有更常见/更好的方式或看起来对吗?

haskell

19
推荐指数
4
解决办法
8659
查看次数

保证有效字符串作为函数参数

我想知道在C++中是否有一种方法可以假定传递给函数的"字符串"(以任何表示形式)是该函数的有效字符串.

我对C/C++很新,但据我所知,在C中,默认情况下会回答这个问题,因为没有别的办法,你只知道你必须检查:

#include <stdio.h>

void foo(const char *str)
{
    if (str)
        printf("%s\n", str);
}

int main()
{
    char *name = "Jack";
    foo(name);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是由于C++提供了额外的东西,比如引用,我想知道是否可以以不必检查的方式编写foo().我试过这样的:

#include <iostream>
#include <string>

void foo(const std::string &str)
{
    std::cout << str << std::endl;
}

int main(void)
{
    std::string name = "Jack";
    foo(name);

    std::string *str = NULL;
    foo(*str);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,我可以欺骗foo()进入SegFault.所以,我猜你总是要检查,不管是什么?

编辑#1:

好的,首先感谢您的所有答案和未来的答案,我们非常感谢!

所以总结到目前为止我学到的东西:

在C++中没有语法方法来编写函数定义来消除实际函数调用的误用.

那是对的吗?如果是这样,我会看到原来的问题得到解答.

所以现在我试图尽可能地将foo()写为防御,这样无论你对foo()如何对待狗,它都不会产生SegFault.

现在,CI会像这样写(假设是短期评估):

#include <stdio.h>

void foo(const char *str, const size_t len)
{
    if (str && …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference

3
推荐指数
1
解决办法
123
查看次数

标签 统计

c++ ×1

haskell ×1

pointers ×1

reference ×1