gpt4 book ai didi

haskell - 将函数解释为具有多种类型

转载 作者:行者123 更新时间:2023-12-04 21:57:21 29 4
gpt4 key购买 nike

这就是我想要做的:

data X = I Int | D Double deriving (Show, Eq, Ord)

{-
-- A normal declaration which works fine
instance Num X where
(I a) + (I b) = I $ a + b
(D a) + (D b) = D $ a + b
-- ...
-}

coerce :: Num a => X -> X -> (a -> a -> a) -> X
coerce (I a) (I b) op = I $ a `op` b
coerce (D a) (D b) op = D $ a `op` b

instance Num X where
a + b = coerce a b (+)

编译时出现错误:

 tc.hs:18:29:
Couldn't match type `Double' with `Int'
In the second argument of `($)', namely `a `op` b'
In the expression: I $ a `op` b
In an equation for `coerce': coerce (I a) (I b) op = I $ a `op` b

coerce 中,我想将 op 解释为 Int -> Int -> IntDouble -> Double -> 双。我想我应该能够做到这一点,因为 op 的类型是 Num a => a -> a -> a

我的主要目标是抽象出功能 Num 子类中所需的重复:我更愿意像在未注释的版本中那样编写它。

最佳答案

您的强制定义将操作类型限制为 Int -> Int -> Int 第一个定义和 Double -> Double -> Double 第二个。如果你真的想说 op 在所有 Num 类中是多态的,那么你应该使用 Rank2Types 让它工作。

coerce :: X -> X -> (forall a . Num a => a -> a -> a) -> X
coerce (I a) (I b) op = I $ a `op` b
coerce (D a) (D b) op = D $ a `op` b
coerce (I a) (D b) op = D $ op (fromIntegral a) b
coerce (D a) (I b) op = D $ op a (fromIntegral b)

关于haskell - 将函数解释为具有多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523023/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com