Haskell 转换为c++;哈斯克尔密码

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])

我想用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])
      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的人来说,即使它很简单。