List 哪里有一个成熟的图书馆;易碎品;列出Haskell的操作?

List 哪里有一个成熟的图书馆;易碎品;列出Haskell的操作?,list,haskell,List,Haskell,几年来,我一直在图书馆里乱丢这样的定义,我不禁要问这个问题: fragileZip :: [t1] -> [t2] -> [(t1, t2)] fragileZip a b = loop a b where loop [] [] = [] loop (h1:t1) (h2:t2) = (h1,h2) : loop t1 t2 loop _ _ = error "fragileZip: lists were not

几年来,我一直在图书馆里乱丢这样的定义,我不禁要问这个问题:

fragileZip :: [t1] -> [t2] -> [(t1, t2)]
fragileZip a b = loop a b
  where
    loop [] []           = []
    loop (h1:t1) (h2:t2) = (h1,h2) : loop t1 t2
    loop _ _             = error "fragileZip: lists were not the same length."
我的经验是,在哈斯凯尔序曲中所做的决定——关于
获取
删除
压缩
,等等,在元素不足时不会出错——允许使用无限列表的可爱技巧,在某些情况下可能很方便,但在某些情况下,它们是导致无声失败的不正当来源,例如,压缩预期长度相同的列表

是否有人知道完整的
数据.List
替换,它试图像上面的zip那样“脆弱”,如果没有达到预期,总是抛出一个错误:如果列表长度不匹配,或者如果没有足够的元素


[脚注:是的,使用total函数编程是很好的,但这意味着使用类型级信息履行相关的证明义务,而不是通过返回错误值来掩盖错误!标准数据可能就是这样一种无声的失败。此外,我也不在乎错误结果如何传达(可能是例外,也可能是例外)。如果有一个符合要求的现有黑客库,我会接受任何东西!]

我认为你的要求违背了Haskell的理念。涉及错误或任何其他运行时崩溃的代码都是不好的

但显然,如果需要,可以在其周围创建一个包装器:

fragileZip :: [a] -> [b] -> [(a,b)]
fragileZip x y = if length x == length y
                 then zip x y
                 else error "Not of the same length"
如果您确实想显示结果类型中的某些错误,那么可以使用类型
或者
来显示。例如:

fragileZip :: [a] -> [b] -> Maybe [(a,b)]
fragileZip x y = if length x == length y
                 then Just $ zip x y
                 else Nothing

我认为您的要求与Haskell的理念背道而驰。涉及错误或任何其他运行时崩溃的代码是不好的

但显然,如果需要,可以在其周围创建一个包装器:

fragileZip :: [a] -> [b] -> [(a,b)]
fragileZip x y = if length x == length y
                 then zip x y
                 else error "Not of the same length"
如果您确实想显示结果类型中的某些错误,那么可以使用类型
或者
来显示。例如:

fragileZip :: [a] -> [b] -> Maybe [(a,b)]
fragileZip x y = if length x == length y
                 then Just $ zip x y
                 else Nothing

你的邮政编码可以在包裹中找到
pair
。包裹中也有
head
tail
及其错误抛出类,而不是
zip
drop
等。你的邮政编码可以在包裹中找到
pair
。包裹中也有
pair
。尽管它的地址是ode>head
tail
及其错误抛出类,而不是
zip
drop
等。

包中包含“更安全”来自
Prelude
的许多函数的版本;它们不会抛出错误,而是在失败时返回
可能
值。不过,您仍将在运行时检测错误

该包从
safe
重新导出函数,并添加其他方便的错误处理函数

如果您愿意深入研究Haskell较新的、依赖类型的特性,
size vector
包提供了在编译时检查其大小的列表。特别是,有一个功能,它只对长度相同的列表进行压缩:

{-# LANGUAGE DataKinds #-}

import Data.Vector.Sized
import Data.Type.Natural

vec2 :: Vector Char Two
vec2 = 'a' :- 'b' :- Nil

vec3 :: Vector Char Three
vec3 = 'x' :- 'y' :- 'z' :- Nil

vecZipped = zipSame vec2 vec3
此代码在编译时失败,错误如下:

Couldn't match type 'S Zero with 'Z
Expected type: Vector Char Two
  Actual type: Vector Char Three
In the second argument of `zipSame', namely `vec3'
In the expression: zipSame vec2 vec3
In an equation for `vecZipped': vecZipped = zipSame vec2 vec3
有关Haskell上的
大小向量
和依赖类型的教程,请参阅。也有有用的信息

(不过,有时压缩不同大小的列表是您想要的。我经常将有限列表压缩为无限列表,因为后者更容易定义。)

包中包含“更安全”来自
Prelude
的许多函数的版本;它们不会抛出错误,而是在失败时返回
可能
值。不过,您仍将在运行时检测错误

该包从
safe
重新导出函数,并添加其他方便的错误处理函数

如果您愿意深入研究Haskell较新的、依赖类型的特性,
size vector
包提供了在编译时检查其大小的列表。特别是,有一个功能,它只对长度相同的列表进行压缩:

{-# LANGUAGE DataKinds #-}

import Data.Vector.Sized
import Data.Type.Natural

vec2 :: Vector Char Two
vec2 = 'a' :- 'b' :- Nil

vec3 :: Vector Char Three
vec3 = 'x' :- 'y' :- 'z' :- Nil

vecZipped = zipSame vec2 vec3
此代码在编译时失败,错误如下:

Couldn't match type 'S Zero with 'Z
Expected type: Vector Char Two
  Actual type: Vector Char Three
In the second argument of `zipSame', namely `vec3'
In the expression: zipSame vec2 vec3
In an equation for `vecZipped': vecZipped = zipSame vec2 vec3
有关Haskell上的
大小向量
和依赖类型的教程,请参阅。也有有用的信息


(然而,有时压缩不同大小的列表是你想要的。我经常用无限的列表压缩有限的列表,因为后者更容易定义。)

很多haskell用户不喜欢错误。因此更像haskell的东西应该是
zip:[A]->[b]>也许[(A,b)]
。这也没问题,但现有的
Data.List的约定确实包括许多错误抛出函数,如(!!)。也会有一些诱因促使替换者保留相同的类型。您可能会喜欢此特定需要的软件包——具体来说。许多haskell用户不喜欢错误。因此,更像haskell风格的东西应该是
zip:[a]->[b]->可能[(a,b)]
。这也没问题,但现有的
Data.List的约定确实包括许多错误抛出函数,如(!!)。也会有一些激励因素促使更换人员保留相同的类型。您可能会喜欢该软件包,以满足这一特定需求。具体而言,我们希望通过履行相关的证明义务,而不仅仅是返回某些内容();-)来实现我们的部分功能。另外,仅供参考,上面的这两个定义遍历列表三次而不是一次,并且失去了以流式方式处理大型列表的能力(这是列表的另一种有时令人怀疑的用法,因此出现了懒惰IO辩论和管道/导管库)。抱歉,在这种情况下,我想我不知道有任何库会这样做。也许你可以创建并将它们放到Hackage上。:)好的,我们希望通过履行相关的证明义务,而不仅仅是返回一些东西();-,来实现我们的部分功能。此外,供参考,上述两个定义将贯穿列表thr