решил запилить некое подобие динамической типизации из лиспа, условно говоря, (+ 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. оно может быть любым, но только одним во всей функции
Обсуждают сегодня