Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 带Maybe的递归_Haskell_Recursion_Immutability - Fatal编程技术网

Haskell 带Maybe的递归

Haskell 带Maybe的递归,haskell,recursion,immutability,Haskell,Recursion,Immutability,我很难尝试编写一个函数来使用递归查找两个列表的总和,如果任何列表为空,则可能什么都没有 以下函数的数学表达式为: Σw[i]x[i] 其中w和x是等长整数数组 这是我的工作代码: example :: [Int] -> [Int] -> Int example [] [] = 0 example (x:xs) (l:ls) = ((x*l) + (example xs ls)) 以下是我想要工作的想法: example :: [Int] -> [Int] -> May

我很难尝试编写一个函数来使用递归查找两个列表的总和,如果任何列表为空,则可能什么都没有

以下函数的数学表达式为:

Σw[i]x[i]
其中w和x是等长整数数组

这是我的工作代码:

example :: [Int] -> [Int] -> Int
example [] [] = 0
example (x:xs) (l:ls) = ((x*l) + (example xs ls))
以下是我想要工作的想法:

example :: [Int] -> [Int] -> Maybe Int
example [] [] = Nothing
example (x:xs) (l:ls) = Just((x*l) + (example xs ls))

谢谢

很接近,但是对
示例xs ls
的递归调用返回一个
可能是Int
,并且不能添加
Int
可能是Int
(在
x*l+示例xs ls
中),因此最后一行出现错误

您可以使用来处理这种情况,使用
0
作为默认总和:

example :: [Int] -> [Int] -> Maybe Int
example [] []         = Nothing
example (x:xs) (l:ls) = Just $ x * l + fromMaybe 0 (example xs ls)
或者(更简洁地说),您可以使用以下方法避免显式递归:

example [] [] = Nothing
example xl yl = Just $ sum $ zipWith (*) xl yl


请注意,在模式匹配中有非穷举模式。两个不同长度的列表将导致模式匹配异常。

您很接近,但是对
示例xs ls
的递归调用返回
可能Int
,并且您不能添加
Int
可能Int
(在
x*l+示例xs ls
中),因此最后一行出现错误

您可以使用来处理这种情况,使用
0
作为默认总和:

example :: [Int] -> [Int] -> Maybe Int
example [] []         = Nothing
example (x:xs) (l:ls) = Just $ x * l + fromMaybe 0 (example xs ls)
或者(更简洁地说),您可以使用以下方法避免显式递归:

example [] [] = Nothing
example xl yl = Just $ sum $ zipWith (*) xl yl


请注意,在模式匹配中有非穷举模式。两个长度不同的列表将导致模式匹配异常。

我在猜测您的意图,不确定我是否正确阅读了它:当两个输入列表长度不同时,您希望函数不产生任何内容

“快乐”的基本情况是
0
,就像第一次尝试一样,但是提升到
可能

example [] [] = Just 0
要处理列表长度不同的情况,请包括只有一个列表为空的情况。如果不包含这些情况,您应该得到编译器关于非穷举模式匹配的警告

example [] _ = Nothing
example _ [] = Nothing
最后一种情况是,有两个非空列表。它看起来很像您第一次尝试时的那一行,除了没有将加法直接应用于
示例xs ys
,我们
fmap
将加法应用于
示例xs ys
,利用了
可能
是一个函数的事实

用法示例:

λ> example [1,2] [3,4]
Just 11

λ> example [1,2] [3,4,5]
Nothing
顺便说一句,如果你想使用一个库,把它变成一个单行程序将是一个不错的选择

import Safe.Exact

example xs ys = fmap sum (zipWithExactMay (*) xs ys)

我在猜测您的意图是什么,不确定我是否正确阅读了它:当两个输入列表长度不同时,您希望函数生成
Nothing

“快乐”的基本情况是
0
,就像第一次尝试一样,但是提升到
可能

example [] [] = Just 0
要处理列表长度不同的情况,请包括只有一个列表为空的情况。如果不包含这些情况,您应该得到编译器关于非穷举模式匹配的警告

example [] _ = Nothing
example _ [] = Nothing
最后一种情况是,有两个非空列表。它看起来很像您第一次尝试时的那一行,除了没有将加法直接应用于
示例xs ys
,我们
fmap
将加法应用于
示例xs ys
,利用了
可能
是一个函数的事实

用法示例:

λ> example [1,2] [3,4]
Just 11

λ> example [1,2] [3,4,5]
Nothing
顺便说一句,如果你想使用一个库,把它变成一个单行程序将是一个不错的选择

import Safe.Exact

example xs ys = fmap sum (zipWithExactMay (*) xs ys)

递归解决方案将始终返回
Nothing
,因为它最终到达空列表大小写。递归解决方案将始终返回
Nothing
,因为它最终到达空列表大小写。在第一个示例中,为什么只得到11而不只是10?@Soldalma,因为它正在计算(1*3)+(2*4)。好的,得到了。在某些情况下,我仍然不熟悉Haskell的语法。为什么在第一个示例中只得到11而不是10?@Soldalma,因为它正在计算(1*3)+(2*4)。好的,明白了。在某些情况下,我仍然不熟悉Haskell的语法。