当前位置: 首页 > 知识库问答 >
问题:

为什么Haskell不接受我的组合“zip”定义?

苍恩
2023-03-14
zip :: [a] -> [a] -> [(a,a)]
zip [] _ = []
zip _ [] = []
zip (x:xs) (y:ys) = (x,y) : zip xs ys
zip' :: [a] -> [a] -> [(a,a)]
zip' = foldr cons nil
    where
        cons h t (y:ys) = (h,y) : (t ys)
        cons h t []     = []
        nil             = const []
zip :: [a] -> [a] -> [a]
zip a b = (zipper a) (zipper b) where
    zipper = foldr (\ x xs cont -> x : cont xs) (const [])
zip.hs:17:19:
    Occurs check: cannot construct the infinite type:
      t0 ~ (t0 -> [a]) -> [a]
    Expected type: a -> ((t0 -> [a]) -> [a]) -> (t0 -> [a]) -> [a]
      Actual type: a
                   -> ((t0 -> [a]) -> [a]) -> (((t0 -> [a]) -> [a]) -> [a]) -> [a]
    Relevant bindings include
      b ∷ [a] (bound at zip.hs:17:7)
      a ∷ [a] (bound at zip.hs:17:5)
      zip ∷ [a] -> [a] -> [a] (bound at zip.hs:17:1)
    In the first argument of ‘foldr’, namely ‘cons’
    In the expression: ((foldr cons nil a) (foldr cons nil b))

zip.hs:17:38:
    Occurs check: cannot construct the infinite type:
      t0 ~ (t0 -> [a]) -> [a]
    Expected type: a -> (t0 -> [a]) -> t0 -> [a]
      Actual type: a -> (t0 -> [a]) -> ((t0 -> [a]) -> [a]) -> [a]
    Relevant bindings include
      b ∷ [a] (bound at zip.hs:17:7)
      a ∷ [a] (bound at zip.hs:17:5)
      zip ∷ [a] -> [a] -> [a] (bound at zip.hs:17:1)
    In the first argument of ‘foldr’, namely ‘cons’
    In the fourth argument of ‘foldr’, namely ‘(foldr cons nil b)’

共有1个答案

卢光远
2023-03-14

至于为什么你的定义不被接受:看看这个:

λ> :t \ x xs cont -> x : cont xs
 ... :: a -> r -> ((r -> [a]) -> [a])

λ> :t foldr
foldr :: (a' -> b' -> b') -> b' -> [a'] -> b'

因此,如果您希望将第一个函数用作foldr的参数,您将得到(如果您匹配foldr的第一个参数的类型:

a' := a
b' := r
b' := (r -> [a]) -> [a]

这当然是一个问题(r(R->[a])->[a]是相互递归的,应该都等于B')

newtype Fix a t = Fix { unFix :: Fix a t -> [a] }

您可以这样写:

zipCat :: [a] -> [a] -> [a]
zipCat a b = (unFix $ zipper a) (zipper b) where
  zipper = foldr foldF (Fix $ const [])
  foldF x xs = Fix (\ cont -> x : (unFix cont $ xs))

你会得到:

λ> zipCat [1..4] [5..8]
[1,5,2,6,3,7,4,8]

这就是(我认为)你想要的。

但很明显,这里的两个列表都需要是相同的类型,所以我不知道这是否真的对你有帮助

 类似资料:
  • 问题内容: 给出以下作为数据类的示例: 假设我会有一个国家清单 我想将这些信息流式传输到它们的区域及其对应的名称,我想执行以下操作: 但是,该代码无法编译,因为“ getRegions”的返回值是一个Collection(列表),而不是flatMap方法接受的Stream。但是由于我知道任何Collection都可以通过其Collection.stream()方法进行流传输,所以这应该不是问题。我

  • 问题内容: 我不明白为什么第15行不做任何输入,将不胜感激:3 输出量 请输入您的问题的第一个数字!2552所以您选择了2552选择您的第二个数字41您选择了第二个数字41现在输入ur运算符 由于某种原因,输出在最后一行结束并停止,并且不接收任何信息! 问题答案: 您需要在调用行的后面立即调用,原因是仅要求下一个整数不会占用输入中的整个行,因此您需要通过调用来跳至输入中的下一个新行字符。 每次您需

  • 从数学上讲,函数合成操作是关联的。因此: 因此,可以将函数合成操作定义为左关联或右关联。 由于Haskell中的正常函数应用(即术语的并列,而不是操作)是关联的,所以我认为函数组合也应该是关联的。毕竟,世界上大多数人(包括我自己)都习惯于从左到右阅读。 null

  • 我试图用seaborn绘图可视化一些数据,csv文件链接不断返回错误“link.csv”不是示例数据集之一我做错了什么?

  • 我的脚本将,作为参数: 但当我将它作为分隔符传递时,它是空的 我知道在参数/参数解析中很特殊,但我以和引用的形式使用它。 为什么它不起作用?我使用的是Python 3.7.3 这是测试代码: 当我运行它作为它打印空。

  • 请求是: localhost:8888/article/createArticle?articleid=1&text=我是一篇文章 为什么收不到请求?