在Haskell中对抽象数据类型进行排序
发布时间:2020-12-12 07:48:22 所属栏目:MsSql教程 来源:网络整理
导读:例如,我有以下, type something = (Float,Float,Int,Aa,Bb,Cc,Int) 如果我想在他们的第一个元素(Float)中找到最小的东西,我怎么能这样做?我的理由如下,但我无法设法如何实现它 因为我有一个东西的列表,最简单的方法应该是创建我自己的min帮助函数,比较2个东
例如,我有以下,type something = (Float,Float,Int,Aa,Bb,Cc,Int) 如果我想在他们的第一个元素(Float)中找到最小的东西,我怎么能这样做?我的理由如下,但我无法设法如何实现它 因为我有一个东西的列表,最简单的方法应该是创建我自己的min帮助函数,比较2个东西并返回两个中最小的.然而,它试图做那种“更简单的方法”让我陷入类型编译错误…… findMin :: something -> something -> somthing findMin x y = sortBy (compare `on` fst) x y 我不熟悉sortBy并进行比较,我刚刚在SO中遇到了类似的问题,但我无法使其成功.作为Haskell的初学者,还有另一种方法可以解决这个问题吗? 解决方法使用自定义数据类型通常是更好的选择,但如果您真的想使用元组,则可以首先定义一个帮助函数comparisonFst,它根据元组的第一个元素进行比较.import Data.Ord import Data.List -- Dummy data types for example purposes. Derive from Show just so -- that the example can be more easily tested interactively in ghci. data Aa = Aa deriving Show data Cc = Cc deriving Show type Something = (Float,Int) comparingFst :: Something -> Something -> Ordering comparingFst = comparing fstSomething where fstSomething (x,_,_) = x 现在您可以使用以下两个元素中的较小元素: findMin :: Something -> Something -> Something findMin x y = case comparingFst x y of LT -> x _ -> y 或者从元素列表中 findMinimum :: [Something]-> Something findMinimum = minimumBy comparingFst 您还可以使用相同的辅助函数进行排序: sortSomethings :: [Something] -> [Something] sortSomethings = sortBy comparingFst 此外,值得一提的是,默认情况下,元组从第一个元素开始按元素进行比较,因此假设您的Aa和Bb类型可以从Ord和Eq派生,您不需要任何额外的东西,即示例变为: import Data.List data Ab = Ab deriving (Show,Ord,Eq) data Cc = Cc deriving (Show,Eq) type Something = (Float,Ab,Int) findMin :: Something -> Something -> Something findMin x y = min x y findMinimum :: [Something]-> Something findMinimum = minimum sortSomethings :: [Something] -> [Something] sortSomethings = sort 换句话说,您可以按原样使用标准的min和sort函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – Microsoft Sync Framework或复制
- 剖析SQLSERVER2005的页面结构--行类型篇一
- Mysql性能优化案例 - 覆盖索引分享
- MSSQL数据库获取TEXT字段的内容长度
- sql-server – 不能模式绑定视图MyName’,因为名称MyTable对
- 往Sqlserver插入数据报错:传入的表格格式数据流(TDS)远程过
- sqlserver 行转列
- sql – 仅当字符串以数字值开头时才选择字符串的数字部分
- SQL Server 卸载VS2011 Developer Preview后Sql Server2008
- SQLSERVER 学习笔记(一) SQL基础 分组 限制结果集范围 抑