У меня есть следующие данные, которые могут иметь корабль или нет:Haskell: если-то-иначе блоки и данные с асимметричными конструкторами
data LaserCollisionResult = NoCollision | LaserToLaserCollision Ship | LaserToShipCollision Ship deriving (Eq, Show)
затем, позже, я пытаюсь проверить, если LaserCollisionResult является типа LaserToLaserCollision, но я получаю сообщение об ошибке. Моя [лямбда] функция заключается в следующем:
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.
Как я могу проверить, является ли LaserCollisionResult в laserCollisionResults имеет тип LaserToLaserCollision?
'map f $ zip xs ys' - это то же самое, что и' zipWith (curry f) xs ys'. Вы можете упростить 'laserPaths''' zipWith (\ p r -> case r of {...}) laserPaths laserCollisionResults'. – Cirdec
@Cirdec Спасибо за это. –