решил запилить некое подобие динамической типизации из лиспа, условно говоря, (+ 1 2) == 3, а (+ 1 2.5) == 3.5. Для этого сделал функцию, в которую передаю операцию (например, (*)) и 2 аргумента в виде оберток над значениям. Хочу, чтоб это работало обобщенно, но в итоге получаю ошибку Couldn't match expected type ‘a’ with actual type ‘Integer’ ‘a’ is a rigid type variable bound by. Как можно это исправить? Вот код:
applyOp :: Num a => (a -> a -> a) -> LispVal -> LispVal -> LispVal
applyOp op (LispNumber a) (LispNumber b) = LispNumber (op a b)
applyOp op (LispNumber a) (LispDouble b) = LispDouble (op (fromIntegral a :: Double) b)
applyOp op (LispDouble a) (LispNumber b) = LispDouble (op a (fromIntegral b :: Double))
applyOp op (LispDouble a) (LispDouble b) = LispDouble (op a b)
В LispNumber лежит Integer, в LispDouble - Double
когда применяешь applyOp, фиксируется a. оно может быть любым, но только одним во всей функции
Обсуждают сегодня