haskell - 后卫可以有多个结果吗?
问题描述
作为 Haskell 的新手,以惯用的方式思考是一项挑战。我有一份双人名单。我想根据两张地图对二元组成员进行加权,一张指示权重方向,另一张提供权重本身。在下面的代码中,1 表示 dyad 的底部成员接受重量;-1 二元组的最高成员接受重量;0 两个成员都获得权重。在所有情况下,决定权重和方向的是二元组成员之间的差异
我的问题是,在权重相等的情况下,如何重新使用顶部和底部重量分配的定义?到目前为止,我咨询过的每一个消息来源似乎都表明守卫只能有一个结果——我怀疑这是正确的 Haskell 方式......
allocateWeight :: [[Integer]] -> (Integer, Integer, Maybe Double)
allocateWeight [x, y]
|direction <= Just 1 = assignBottom
|direction <= Just (-1) = assignTop
|direction <= Just 0 = (?? assignBottom and assignTop ??)
where diff = (abs(x!!1 - y!!1))
direction = Map.lookup diff getWeightDirection
weight = Map.lookup diff schemaCAT
assignBottom = (head x, last x, weight)
assignTop = (head y, last y, weight)
好的,我已被要求进一步澄清。我会削减非必需品,因为它们只会使问题变得模糊。
第 1 阶段:从值列表开始,例如: [6, 3, 8, 11, 2] :值限制在 1 和 12 之间。
第 2 阶段:将它们排列成对子:[(6,3),(6,8), (6,11), (6,2), (3, 8), (3, 11),(3, 2) ,(8, 11)(8, 2),(11,2)]
第三阶段:获取每一对的绝对差:[(3),(2),(5),(4),(5),(8),(1),(3),(6),(9 )]
第四阶段:根据他们之间的差异,每个对子中的一名成员(6人除外)将获得权重;这是在以下地图中预先确定的:
getWeightDiretion :: Map.Map Integer Integer -- determine weight direction
getWeightDirection = Map.fromList $
[(1, -1),
(2, -1),
(3, 1),
(4, 1),
(5, -1),
(6, 0),
(7, 1),
(8, -1),
(9, -1),
(10, 1),
(11, 1),
(12, 1))]
如前所述,如果地图查找的值为 1,则权重下降;-1 到顶部。问题是当查找键为 6 时,二元组成员的权重都不大于另一个:也就是说,它们的权重相等。权重也是通过在此映射中查找键来预先确定的:
schemaCAT :: Map.Map Integer Double --Cross-At-Tail weighting scheme
schemaCAT = Map.fromList $
[(12, 0.985),
(11, -0.7),
(10, 0.2),
(9, 0.4),
(8, 0.6),
(7, 0.9),
(6, 0.08),
(5, 0.8),
(4, 0.7),
(3, 0.5),
(2, 0.1),
(1, -0.8),
(999, 0.25)]
allocateWeights 函数的输入格式为 [[(-1, 6), (0, 3)], [.... 其中每个子列表中每个元组的第一个成员是转置因子 - 即在这里不相关;第二个是排列对之一。输入中的每个子列表代表一个排列。allocateWeights 函数直接对每个子列表中每个元组的 x!!1 进行操作。
应用上述内容后,我应该得到一个元组列表 [(-1, 3, 0.5)....] 第二个元组成员是接收权重的元组成员,第三个是权重本身(我'将省略元组的第一个成员,因为它并不重要。与键 999 相同,这是一个特殊情况)。
据我了解,我有两个问题。首先,maps 返回 Maybes 并且在守卫中使用这些值是有问题的,其次是在守卫中的表达式右侧使用两个定义的问题。仍在为“Justs”和“Maybes”而苦苦挣扎:(
谢谢....
解决方案
推荐阅读
- python - (熊猫):ISIN()和包含()有什么区别
- r - 回答:几个图中相同的geom_rect
- c# - 实体框架,将 2 X 1 对 1 关系映射到同一模型
- java - Java-批量插入记录在MYSQL中不起作用
- css - CSS 嵌套类选择器
- gmail - 邮件将进入收件人垃圾邮件文件夹
- asp.net-web-api - Asp .Net Core Web API 在哪里订阅 RabbitMQ
- python - 如何正确设置tensorflow中占位符的值?
- php - laravel 5.7 中缺少“password.update”文件
- excel - 关闭 Excel 时如何显示选项卡和功能区?