Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell分区类型不匹配?_Haskell_Types_Typeclass - Fatal编程技术网

haskell分区类型不匹配?

haskell分区类型不匹配?,haskell,types,typeclass,Haskell,Types,Typeclass,我是Haskell的新手,我正在尝试为家庭作业实现一个计算器。我被困在需要对两个值进行除法的地方,我认为问题在于无法推断它们的类型,或者需要声明/转换它们的类型。我正在努力学习如何自己解决这个问题,但在此过程中的任何见解都会有所帮助 代码如下: data Value e = OK e | Error String deriving (Eq) -- assuming we know how to type e can be shown, i.e. Show e, then -- we know

我是Haskell的新手,我正在尝试为家庭作业实现一个计算器。我被困在需要对两个值进行除法的地方,我认为问题在于无法推断它们的类型,或者需要声明/转换它们的类型。我正在努力学习如何自己解决这个问题,但在此过程中的任何见解都会有所帮助

代码如下:

data Value e = OK e | Error String deriving (Eq)

-- assuming we know how to type e can be shown, i.e. Show e, then
-- we know how to show a Value e type
instance (Show e) => Show (Value e) where
    show (OK x) = (show x)
    show (Error s) = "ERROR: " ++ s

type Token = String
type Result = Value Int
type Intermediate = [ (Value Int) ]

-- an algebra is a things that knows about plus and times
class Algebra a where
    plus :: a -> a -> a
    times :: a -> a -> a
    subtraction :: a -> a -> a
    division :: a -> a-> a

-- assuming that we know how to + and * things of type e, (i.e.
-- we have Num e, then we have algebra's over Value e 
instance (Num e) => Algebra (Value e) where
    plus (OK x) (OK y) = (OK (x+y))
    times (OK x) (OK y) = (OK (x*y))
    subtraction (OK x) (OK y) = (OK (x-y))
    division (OK x) (OK 0) = (Error "div by 0")
    division (OK x) (OK y) = (OK (x `div` y))   <-- this is line 44 that it complains about
这里有更多的代码,我想为了清晰起见,我会把它删掉,但如果不清楚的话,我可以随时编辑它

div :: (Integral a) => a -> a -> a
(/) :: (Fractional a) => a -> a -> a

numa
既不意味着
积分a
也不意味着
分数a
(当然,倒过来也适用)。如果要使用
div
,则必须提供至少与
Integral a
上下文一样严格的内容。

div
仅对
Integral
值进行操作(在标准前奏曲中仅
Int
Integral
Float
Double
支持使用
/
运算符进行除法,但问题的根源在于
Num
typeclass实际上并不强制执行任何类型的除法操作


这是有道理的-有很多数字集合,我们可能希望在乘法是不可逆的情况下创建
Num
的实例-除法运算基本上是没有意义的。

。。。我不敢相信我花了这么长时间在它上面,我在所有错误的地方寻找,试图限制使用e的类型。您指出Num使我找到了
实例(Num e)=>
可能是我在测试期间没有考虑更改的唯一一行代码。。。谢谢你这不应该是个问题。。
div :: (Integral a) => a -> a -> a
(/) :: (Fractional a) => a -> a -> a