48

Haskell は初めてで、コードのデバッグに苦労しています。エラーを修正すると、他のエラーが発生します...

これが私のコードです。

import Data.Maybe

data Op = Add | Sub | Mul | Div | And | Or | Not | Eq | Less | Great
    deriving (Eq, Show)

data Exp = Literal Value
     | Primitive Op [Exp]
     | Variable String
     | If Exp Exp Exp
     | Let [(String, Exp)] Exp
    deriving (Show, Eq)

data Value = Number Int
       | Bool Bool
       | String String
    deriving (Eq, Show)

type Env = [(String, Value)]

eval :: Env -> Exp -> Value
eval e (Literal v) = v
eval e (Variable x) = fromJust (lookup x e)   --22

prim :: Op -> [Value] -> Value
prim Add [Number a, Number b] = Number (a + b)
prim And [Bool a, Bool b] = Bool (a && b)
prim Sub [Number a, Nuamber b] = Number (a - b)   -- No instance for (Fractional Int) arising from a use of `/'
prim Mul [Number a, Number b] = Number (a * b)
prim Div [Number a, Number b] = Number (a / b)
prim Or [Bool a, Bool b] = Bool (a || b)
prim Not [Bool a] = Bool (not a)
prim Eq [Number a, Number b] = Bool (a == b)
prim Eq [String a, String b] = Bool (a == b) 
prim Less [Number a, Number b] = Bool (a < b)
prim Less [String a, String b] = Bool (a < b)
prim Great [Number a, Number b] = Bool (a > b)
prim Great [String a, String b] = Bool (a > b) --37

main = do
    eval [("y", (Number 40))] (Let [("x", (Literal (Number 2)))] (prim Add [(Variable "x"), (Variable "y")])) -- Couldn't match expected type `Exp' with actual type `Value'

コメントに書いた2つのエラーが発生しています。私のコードの何が問題なのかを知っている場合は、アイデアを共有して時間を節約してください...

どうもありがとうございました。

4

2 に答える 2

29

あなたが抱えている問題は、Haskell が整数除算と「分数」除算に対して異なる関数を持っていることです。整数除算は切り捨てますが、分数除算は切り捨てません。だから代わりに

prim Div [Number a, Number b] = Number (a / b)

あなたがしたい

prim Div [Number a, Number b] = Number (a `div` b)

エラー メッセージが実際に意味することは、関数がクラス(/)の一部であることです。Fractionalこれは基本的に、さまざまなタイプが実装できるインターフェースです。それに関する情報を取得するには、ghciを起動して実行します

Prelude> :i (/)
class Num a => Fractional a where
(/) :: a -> a -> a
...
-- Defined in `GHC.Real'
infixl 7 /

Prelude> :i Int
data Int = GHC.Types.I# GHC.Prim.Int#   -- Defined in `GHC.Types'
instance Bounded Int -- Defined in `GHC.Enum'
instance Enum Int -- Defined in `GHC.Enum'
instance Eq Int -- Defined in `GHC.Classes'
instance Integral Int -- Defined in `GHC.Real'
instance Num Int -- Defined in `GHC.Num'
instance Ord Int -- Defined in `GHC.Classes'
instance Read Int -- Defined in `GHC.Read'
instance Real Int -- Defined in `GHC.Real'
instance Show Int -- Defined in `GHC.Show'

1 つ目は、関数に関する情報を提供します。これは、関数(/)がクラス内にあることを示していますFractional。次に、:i Intのすべてのインスタンスが表示されますIntIntは のインスタンスではないため、 と一緒にFractional使用できないことに注意してください。(/)Int

別のヒント: バッククォート (`) は関数を中置演算子に変えます。

a `div` b

と同じです

div a b
于 2013-02-01T23:33:34.750 に答える