型の異なる値の計算について教えて下さい
以下の関数 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
| このような場合、なにか上手に解決する方法はあるのでしょうか ?