Haskell类型匹配错误求助:解析Maybe [Int]函数签名并修复代码
Haskell 函数类型解析与编译错误修复
一、函数类型签名 countPositivesSumNegatives :: Maybe [Int] -> [Int] 详解
这不是函数定义本身,是Haskell的类型签名,用来明确函数的输入输出规则:
countPositivesSumNegatives:函数的名称:::读作“具有类型”,用于分隔函数名和它的类型描述Maybe [Int]:函数的输入类型。Maybe是Haskell内置的类型构造器,专门用来表示“可选值”:Just [1, -2, 3]:表示输入是一个有效的整数列表Nothing:表示输入没有值(空的情况)
-> [Int]:函数的输出类型,要求返回一个整数列表——按照题目需求,列表第一个元素是输入列表中正数的个数,第二个元素是输入列表中负数的总和。
二、编译错误原因与修复
错误原因
你直接把类型为Maybe [Int]的xs当成普通列表来用了:
null xs:null函数只能用来判断列表是否为空,但xs是Maybe类型,不是列表- 列表推导
x <- xs:列表推导的数据源必须是可遍历的列表类型,Maybe是另一种容器,不能直接放在<-后面提取元素
修复方案
需要先处理Maybe的两种情况(Nothing和Just包裹的列表),推荐用模式匹配(直观易懂,适合初学者):
module Kata where countPositivesSumNegatives :: Maybe [Int] -> [Int] -- 处理输入为Nothing的情况,返回空列表 countPositivesSumNegatives Nothing = [] -- 处理输入为Just包裹的列表的情况,提取出内部列表xs进行计算 countPositivesSumNegatives (Just xs) = let positiveCount = length [x | x <- xs, x > 0] negativeSum = sum [x | x <- xs, x < 0] in [positiveCount, negativeSum]
也可以用filter函数简化列表推导,让代码更简洁:
module Kata where countPositivesSumNegatives :: Maybe [Int] -> [Int] countPositivesSumNegatives Nothing = [] countPositivesSumNegatives (Just xs) = [length (filter (> 0) xs), sum (filter (< 0) xs)]
如果想更紧凑,还可以用maybe高阶函数(把默认值和处理逻辑传给它):
module Kata where countPositivesSumNegatives :: Maybe [Int] -> [Int] countPositivesSumNegatives = maybe [] (\xs -> [length (filter (>0) xs), sum (filter (<0) xs)])
内容的提问来源于stack exchange,提问作者χerфmiи
相关产品推荐
相关产品推荐

