haskell - 在 Haskell 中的另一个函数内部调用函数
问题描述
我对 Haskell 真的很陌生。我有两个用于元组数组的函数。第一个用 0 或 1 替换 Bool 值。
boolToInt :: [([Char], Bool)] -> [([Char], Int)]
boolToInt ((x, True):xs) = (x, 1): boolToInt xs
boolToInt ((x, False):xs) = (x, 0): boolToInt xs
boolToInt [] = []
Second 对列表中的第二个值求和
teamNumberOfWins :: [([Char], Int)] -> Int
teamNumberOfWins [] = 0
teamNumberOfWins ((x, y):xs) = sum + y
where sum = teamNumberOfWins xs
对于第二个函数列表必须已经具有 Int 值。有没有办法调用第二个函数第一个?我试过这样的事情:
teamNumberOfWins :: [([Char], Int)] -> Int
teamNumberOfWins [] = 0
teamNumberOfWins ((x, y):xs) = sum + y
where sum = teamNumberOfWins (boolToInt xs)
但它不起作用。有人能帮我吗?
解决方案
为你辩护:
teamNumberOfWins :: [([Char], Int)] -> Int
teamNumberOfWins [] = 0
teamNumberOfWins ((x, y):xs) = sum + y
where sum = teamNumberOfWins (boolToInt xs)
最后一行有问题。xs
是 type 的值[([Char], Int)]
,但boolToInt
仅被定义为对 type 的值起作用[([Char], Bool)]
。Haskell 有一个非常严格的类型系统(这实际上是该语言的优势之一),根本不允许你这样做。
您显然想要做的是获取 type 列表,然后[([Char], Bool)]
apply boolToInt
,然后 apply teamNumberOfWins
(您的原始版本)到结果。这被称为函数组合,Haskell 有一个非常有用的内置函数/运算符来执行此操作,这很简单.
因此,您需要做的就是保持前 2 个函数不变,并定义一个新函数:
teamNumberOfWins' = teamNumberOfWins . boolToInt
请注意,您还可以大大简化boolToInt
使用map
函数的定义,它将一个元素的函数应用于列表的每个元素。因此:
boolToInt = map singleBoolToInt
where singleBoolToInt (x, True) = (x, 1)
singleBoolToInt (x, False) = (x, 0)
推荐阅读
- c# - 在 int List 中插入值然后对列表进行排序的最快方法
- python-3.x - Watson-NLU 在循环中给出下游问题(500),但不是单独在句子上
- javascript - 检测可编辑 div 中动态创建的跨度上的退格键
- android - 如何更改后台运行的应用程序图标?
- javascript - Javascript从url打开txt并输出为HTML
- android - 使用 google smart lock 进行 oauth 登录方法
- c# - 处理 Access 数据库时处理缓慢
- reactjs - 在 Facebook 评论中反应使用
- c# - 等到协程完成后再启动另一个协程 [Unity C#]
- arrays - Angular ngfor ,只显示一条记录