Haskell 转换为c++;哈斯克尔密码
我想用haskell编写这个函数 它是一个具有o(m+n)复杂性的并集函数Haskell 转换为c++;哈斯克尔密码,haskell,Haskell,我想用haskell编写这个函数 它是一个具有o(m+n)复杂性的并集函数 int printUnion(int arr1[], int arr2[], int m, int n) { int i = 0, j = 0; while(i < m && j < n) { if(arr1[i] < arr2[j]) printf(" %d ", arr1[i++]); else if(arr2[j] < arr1[i])
int printUnion(int arr1[], int arr2[], int m, int n)
{
int i = 0, j = 0;
while(i < m && j < n)
{
if(arr1[i] < arr2[j])
printf(" %d ", arr1[i++]);
else if(arr2[j] < arr1[i])
printf(" %d ", arr2[j++]);
else
{
printf(" %d ", arr2[j++]);
i++;
}
}
/* Print remaining elements of the larger array */
while(i < m)
printf(" %d ", arr1[i++]);
while(j < n)
printf(" %d ", arr2[j++]);
}
int-printUnion(int-arr1[],int-arr2[],int-m,int-n)
{
int i=0,j=0;
而(i
编程语言之间的区别不仅在于不同的编程语言是不同的,而且在于我们使用不同的编程语言是不同的。例如C和C++是类似的编程语言,但是C程序往往分配一些大的内存块,C++程序倾向于分配更多但更小的内存块。
因此:虽然您的C函数接受两个数组(并且必须显式地传递它们的长度),但在Haskell中,我们将使用列表。(这并不是说Haskell程序从不使用数组,就像C程序不使用列表一样,只是C程序倾向于使用数组,Haskell程序倾向于使用列表。)
您的C函数调用printf()
,这两个函数都格式化输出并将其发送到stdout,但我们将分别讨论这些内容showSpaced
适用于我们可以传递到show
的所有值
union :: Ord a => [a] -> [a] -> [a]
union xs [] = xs
union [] ys = ys
union xs0@(x:xs1) ys0@(y:ys1) = case x `compare` y of
LT -> x : union xs1 ys0
GT -> y : union xs0 ys1
EQ -> y : union xs1 ys1
此union
函数只需要比较底层元素。这两个列表必须具有彼此相同的类型。您会注意到,我们使用递归而不是循环,通过使用列表而不是数组,我们不必跟踪数组索引
我们使用模式匹配,通过为union
本身和case
表达式提供三个等式。模式匹配在Haskell中很重要:为自己找到一个解释它的教程
printUnion :: (Ord a, Show a) => [a] -> [a] -> IO ()
printUnion xs ys = mapM_ (putStr . showSpaced) (union xs ys)
因此,在printUnion
中,我们将它们放在一起。列表元素需要实现Ord
(因此我们可以调用union
)和Show
(因此我们可以调用showSpaced
),因此它们都出现在类型签名中
由于您来自C,您可能会担心建立中间列表的效率。不要这样:乐观主义者会把一切都融合到一个循环中
编程语言之间的区别不仅在于不同的编程语言是不同的,而且在于我们使用不同的编程语言是不同的。例如C和C++是类似的编程语言,但是C程序往往分配一些大的内存块,C++程序倾向于分配更多但更小的内存块。
因此:虽然您的C函数接受两个数组(并且必须显式地传递它们的长度),但在Haskell中,我们将使用列表。(这并不是说Haskell程序从不使用数组,就像C程序不使用列表一样,只是C程序倾向于使用数组,Haskell程序倾向于使用列表。)
您的C函数调用printf()
,这两个函数都格式化输出并将其发送到stdout,但我们将分别讨论这些内容showSpaced
适用于我们可以传递到show
的所有值
union :: Ord a => [a] -> [a] -> [a]
union xs [] = xs
union [] ys = ys
union xs0@(x:xs1) ys0@(y:ys1) = case x `compare` y of
LT -> x : union xs1 ys0
GT -> y : union xs0 ys1
EQ -> y : union xs1 ys1
此union
函数只需要比较底层元素。这两个列表必须具有彼此相同的类型。您会注意到,我们使用递归而不是循环,通过使用列表而不是数组,我们不必跟踪数组索引
我们使用模式匹配,通过为union
本身和case
表达式提供三个等式。模式匹配在Haskell中很重要:为自己找到一个解释它的教程
printUnion :: (Ord a, Show a) => [a] -> [a] -> IO ()
printUnion xs ys = mapM_ (putStr . showSpaced) (union xs ys)
因此,在printUnion
中,我们将它们放在一起。列表元素需要实现Ord
(因此我们可以调用union
)和Show
(因此我们可以调用showSpaced
),因此它们都出现在类型签名中
由于您来自C,您可能会担心建立中间列表的效率。不要这样:乐观主义者会把一切都融合到一个循环中。嗯。。。是的,你会吗?说真的,你连个问题都没提。你的问题是“你能帮我做这个吗?”?如果是这样,那么您误解了S.O.的目的和大多数Haskell贡献者的目标。也许你已经试着解决了这个问题,却被困在了我们可以帮助的地方?那导入呢?在Haskell中,这几乎是不需要动脑筋的事,显然你应该先对语言有一个基本的了解。这是家庭作业吗?你有没有尝试在haskell中创建类似的东西?@AndrewC该合并函数保留重复的元素,而给定一对列表,每个列表包含一个特定元素,OP的代码只输出该元素一次,而不是两次。对于那些试图学习haskell的人来说,即使它很简单。嗯。。。是的,你会吗?说真的,你连个问题都没提。你的问题是“你能帮我做这个吗?”?如果是这样,那么您误解了S.O.的目的和大多数Haskell贡献者的目标。也许你已经试着解决了这个问题,却被困在了我们可以帮助的地方?那导入呢?在Haskell中,这几乎是不需要动脑筋的事,显然你应该先对语言有一个基本的了解。这是家庭作业吗?你有没有尝试在haskell中创建类似的东西?@AndrewC该合并函数保留重复的元素,而给定一对列表,每个列表包含一个特定元素一次,OP的代码只输出该元素一次,而不是两次。对于那些试图学习haskell的人来说,即使它很简单。