Haskell:if-then-else block 和具有非对称构造函数的数据

标签 haskell types functional-programming lazy-evaluation purely-functional

我有以下数据可以有没有 Ship:

data LaserCollisionResult = NoCollision | LaserToLaserCollision Ship | LaserToShipCollision Ship deriving (Eq, Show)

然后,稍后,我尝试检查 LaserCollisionResult 是否属于 LaserToLaserCollision 类型,但出现错误。我的 [lambda] 函数是这样的:

laserPaths' = map (\(p,r) -> if r == LaserToLaserCollision then doSomethingWith p else p) $ zip laserPaths laserCollisionResults

我得到的错误是:

Couldn't match type 'LaserCollisionResult' with 'Ship -> LaserCollisionResult'
Expected type: [Ship -> LaserCollisionResult]
Actual type: [LaserCollisionResult]
In the second argument of 'zip', namely laserCollisionResults.

如何检查 laserCollisionResults 中的 LaserCollisionResult 是否属于 LaserToLaserCollision 类型?

最佳答案

将您的 lambda 替换为

(\(p,r) -> case r of {LaserToLaserCollision _ -> doSomethingWith p; _ -> p})

顺便说一下,为此您不需要派生 Eq 实例。

关于Haskell:if-then-else block 和具有非对称构造函数的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514487/

相关文章:

haskell - 允许代理拥有其内部状态

c# - 如何处理 FileHelper 类中 SQLDecimal 数据类型的空值

java - 需要在 FileNameFilter 接口(interface)的 lambda 表达式内构造文件实例

scala - 如何将 ADT 列表分成其变体?

haskell - 使用多个参数类型类时 Haskell 中的模棱两可的类型变量

list - 在 Haskell 中使用列表理解生成列表列表的函数

haskell - 使用 Number 作为 Monoid

python - 如何从数据库数据中取平均值?类型错误 : unsupported operand type(s) for/: 'Decimal' and 'float'

haskell - 为什么类型系统拒绝我看似有效的程序?

functional-programming - (调用/抄送): What exactly is continuation?