首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将函数解释为具有多种类型

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

Stack Overflow用户
提问于 2012-11-23 12:17:08
回答 1查看 96关注 0票数 2

这就是我想要做的:

代码语言:javascript
运行
复制
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 (+)

编译时,我得到一个错误:

代码语言:javascript
运行
复制
 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 -> Double。我认为我应该能够这样做,因为op是Num a => a -> a -> a类型的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 12:42:13

您对强制的定义将op的类型限制为第一个定义为Int -> Int -> Int,第二个为Double -> Double -> Double。如果您真的想说op在for all Num类中是多态的,那么您应该使用Rank2Types来使其工作。

代码语言:javascript
运行
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13523023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档