型の異なる値の計算について教えて下さい
以下の関数 f は a, b に対し fromIntegral を適用することで (+) の引数とできます。
これを
このような場合、なにか上手に解決する方法はあるのでしょうか ?
以下の関数 f は a, b に対し fromIntegral を適用することで (+) の引数とできます。
import Data.Word import Data.Function ( on ) import Control.Monad ( liftM2 ) f = do let a = pure 1 :: Maybe Word32 let b = pure 2 :: Maybe Word64 let a' = fromIntegral <$> a let b' = fromIntegral <$> b let c = (+) <$> a' <*> b' print c --- ghci> f Just 3 it :: ()
これを
on
関数を使って一気に適用すると a, b の型が異なるため不可能です。g = do let a = pure 1 :: Maybe Word32 let b = pure 2 :: Maybe Word64 let c = on (liftM2 (+)) (fromIntegral <$>) a b print c --- a.hs:23:50: error: • Couldn't match type 'Word64' with 'Word32' Expected: Maybe Word32 Actual: Maybe Word64 • In the fourth argument of 'on', namely 'b' In the expression: on (liftM2 (+)) (fromIntegral <$>) a b In an equation for 'c': c = on (liftM2 (+)) (fromIntegral <$>) a b | 23 | let c = on (liftM2 (+)) (fromIntegral <$>) a b |
このような場合、なにか上手に解決する方法はあるのでしょうか ?