Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 递归函数_Haskell_Recursion - Fatal编程技术网

Haskell 递归函数

Haskell 递归函数,haskell,recursion,Haskell,Recursion,我在一个练习中遇到了问题,我应该定义一个函数,该函数以整数、字符和字符串作为输入,并返回将字符放入字符串中整数指定位置的结果,例如,给出3、'a'和“haskell”对函数的修改应导致“hasakell” 这将在C中起作用# 这将在C#中实现这一点:如果有一个列表,其中第一个元素称为“x”,其余元素称为“xs”(在Haskell中,这将被写为(x:xs)),则可以将给定的值前置到位置的列表中,即0。否则,您将在列表的剩余部分递归调用自己(并减少泊松) 如果它看起来很奇怪,那么(x:xs)实际上是

我在一个练习中遇到了问题,我应该定义一个函数,该函数以整数、字符和字符串作为输入,并返回将字符放入字符串中整数指定位置的结果,例如,给出
3
'a'
“haskell”
对函数的修改应导致
“hasakell”

这将在C中起作用#


这将在C#

中实现这一点:如果有一个列表,其中第一个元素称为“x”,其余元素称为“xs”(在Haskell中,这将被写为
(x:xs)
),则可以将给定的值前置到位置的列表中,即0。否则,您将在列表的剩余部分递归调用自己(并减少泊松)

如果它看起来很奇怪,那么
(x:xs)
实际上是一个“解构”列表。
x
表示列表的第一个元素,
xs
(s表示“复数”,因此是“x”的复数形式)是列表的其余部分

所以用零来调用它实际上是在给定值的前面,如

putinto 0 'a' "haskell"  -- yields 'ahaskell'
用两个字母来称呼它将是:

putinto 2 'a' "haskell"
-- same as 'h' : putinto 1 'a' "askell"
-- same as 'h' : 'a' : putinto 0 'a' "skell"
-- same as 'h' : 'a' : 'a' : "skell"
-- same as "haaskell"

尽管如此,您仍然需要注意错误检查(如果给定位置为负数,或大于列表长度怎么办?)

这样考虑:有一个列表,其中第一个元素称为“x”,其余元素称为“xs”(在Haskell中,这将写为
(x:xs)
),您可以将给定值前置到位置为0的列表中。否则,您将在列表的剩余部分递归调用自己(并减少泊松)

如果它看起来很奇怪,那么
(x:xs)
实际上是一个“解构”列表。
x
表示列表的第一个元素,
xs
(s表示“复数”,因此是“x”的复数形式)是列表的其余部分

所以用零来调用它实际上是在给定值的前面,如

putinto 0 'a' "haskell"  -- yields 'ahaskell'
用两个字母来称呼它将是:

putinto 2 'a' "haskell"
-- same as 'h' : putinto 1 'a' "askell"
-- same as 'h' : 'a' : putinto 0 'a' "skell"
-- same as 'h' : 'a' : 'a' : "skell"
-- same as "haaskell"

尽管如此,您仍然需要关心错误检查(如果给定位置为负,或大于列表长度怎么办?)。

在编写涉及Haskell中列表的问题的显式递归解决方案之前,值得检查的是,是否可以使用
Prelude
Data.list
中的列表功能完成相同的任务。在这种情况下,
splitAt
可以帮助:

splitAt 3 "haskell"
("has","kell")
因此,您的问题可以通过拆分、考虑和附加以下内容轻松解决:

putInto :: Int -> Char -> String -> String
putInto n c xs = let (ys,zs) = splitAt n xs in ys ++ (c:zs)
为了好玩,还可以使用
(->r)
的应用程序实例以无点方式编写上述内容:

putino::Int->Char->String->String
输入nc=(++).fst(c:).snd)。斯普利塔特n

在为Haskell中涉及列表的问题编写显式递归解决方案之前,值得检查一下,是否可以使用
序言
Data.list
中的列表函数完成相同的任务。在这种情况下,
splitAt
可以帮助:

splitAt 3 "haskell"
("has","kell")
因此,您的问题可以通过拆分、考虑和附加以下内容轻松解决:

putInto :: Int -> Char -> String -> String
putInto n c xs = let (ys,zs) = splitAt n xs in ys ++ (c:zs)
为了好玩,还可以使用
(->r)
的应用程序实例以无点方式编写上述内容:

putino::Int->Char->String->String
输入nc=(++).fst(c:).snd)。斯普利塔特n

我认为这应该很容易阅读。我列举了几行文字进行解释:

1. putInto :: Int -> Char -> String -> String
2. putInto 0 a xs     = a:xs
3. putInto _ a []     = [a]
4. putInto n a (x:xs) = x : putInto (n-1) a xs
这是怎么回事?第一行是类型签名。第二行检查您是否希望在前面设置字符(即索引0)

第三行和第四行用于我们希望在第0个索引之后插入它。第三行检查要插入的列表是否为空,在这种情况下,我们只返回只包含
a
的列表


在第四行中,我们知道字符串的第一个索引仍然是第一个索引,所以我们只是在尾部递归,根据需要减少
n

我认为这应该很容易阅读。我列举了几行文字进行解释:

1. putInto :: Int -> Char -> String -> String
2. putInto 0 a xs     = a:xs
3. putInto _ a []     = [a]
4. putInto n a (x:xs) = x : putInto (n-1) a xs
这是怎么回事?第一行是类型签名。第二行检查您是否希望在前面设置字符(即索引0)

第三行和第四行用于我们希望在第0个索引之后插入它。第三行检查要插入的列表是否为空,在这种情况下,我们只返回只包含
a
的列表


在第四行中,我们知道字符串的第一个索引仍然是第一个,所以我们只是在尾部递归,根据需要减少
n

告诉我们,你尝试了什么?你在问什么编码/编程语言?告诉我们,你尝试了什么?你问的是哪种编码/编程语言?对不起,我不知道它必须是haskell,没有听说过它。对不起+1:回答了一次,haskell没有被明确标记为需求。摘自原始问题:
putino::Int->Char->String->String
。你觉得这像是C吗?对不起,我不明白它必须是haskell做的,我没听说过。对不起+1:在一次回答中,haskell没有被明确标记为需求。摘自原始问题:
putino::Int->Char->String->String
。你觉得这像是C#吗?re:错误检查。在Haskell中,这不能只是“添加到”中,函数的类型签名必须更改为`Int->a->[a]->Maybe[a]之类的内容。因为这不是问题的类型签名,所以我建议最好的方法就是快速失败。re:错误检查。在Haskell中,这不能只是“添加到”中,函数的类型签名必须更改为`Int->a->[a]->Maybe[a]之类的内容。由于这不是问题的类型签名,我建议最好的方法是快速失败