Haskell 获取错误:在输入上解析错误‘;只是’;

Haskell 获取错误:在输入上解析错误‘;只是’;,haskell,functional-programming,haskell-platform,Haskell,Functional Programming,Haskell Platform,但是编译器给了我一个错误“error:parse error on input'Just' " 我做错了什么?关于要应用的参数数量和查找中的类型,我遇到了一个错误,但此代码类型检查: data Type = Nat | Bool | App Type Type | Var String deriving (Eq, Show) type Substitution = [(String, Type)] apply :: Substitution -> Type -> Ty

但是编译器给了我一个错误“error:parse error on input'Just' "


我做错了什么?

关于要应用的参数数量和查找中的类型,我遇到了一个错误,但此代码类型检查:

data Type = Nat | Bool | App Type Type | Var String 
     deriving (Eq, Show)

type Substitution = [(String, Type)]

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s Var c = case (lookup s c) of 
                Nothing -> (Var c)
                Just v  ->  v

请注意
Var c
周围的括号以及
查找cs

的顺序。我得到了一个关于要应用的参数数量和查找中的类型的错误,但此代码类型检查:

data Type = Nat | Bool | App Type Type | Var String 
     deriving (Eq, Show)

type Substitution = [(String, Type)]

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s Var c = case (lookup s c) of 
                Nothing -> (Var c)
                Just v  ->  v

请注意
Var c
周围的括号以及
查找cs

的顺序。我无法在本地重现错误,因此我猜测您使用了制表符和空格,但是如果您将代码复制粘贴到编辑器中,它应该“起作用”。但在这种情况下,我们会收到另一个错误:

data Type = Nat | Bool | App Type Type | Var String
    deriving (Eq, Show)

type Substitution = [(String, Type)]

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s (Var c) = case (lookup c s) of
    Nothing -> (Var c)
    Just v -> v
这是因为你写了:

GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( tmp.hs, interpreted )

tmp.hs:7:1: error:
    Equations for ‘apply’ have different numbers of arguments
      tmp.hs:7:1-17
      tmp.hs:(9,1)-(11,29)
Failed, modules loaded: none.
Haskell假设您在这里编写了三个参数:
s
Var
c
,但是
c
当然属于
Var
数据构造函数。我们可以用一对括号来解决这个问题。此外,您以错误的方式调用
lookup
lookup
具有类型,因此第一个参数是键(这里是
c
),第二个参数是lookup table
s
。因此,我们可以通过以下方法解决此问题:

apply s Var c = -- ...
请注意,您可以去掉
案例
模式匹配,并使用例如:

我们还可以将
Nat
Bool
病例分组:

import Data.Maybe(fromMaybe)

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s d@(Var c) = fromMaybe d (lookup c s)
当然,如果
Type
不是
Var c
模式,我们应该返回
Type


也许您还需要递归调用
apply
,因为替换可能导致另一个
Var
(因此您必须进行额外的查找)。但是,这将在语义上改变函数(!),因此我不确定这是否是一个要求。

我无法在本地重现错误,因此我猜测您使用了制表符和空格,如果您将代码复制粘贴到编辑器中,它应该“起作用”。但在这种情况下,我们会收到另一个错误:

data Type = Nat | Bool | App Type Type | Var String
    deriving (Eq, Show)

type Substitution = [(String, Type)]

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s (Var c) = case (lookup c s) of
    Nothing -> (Var c)
    Just v -> v
这是因为你写了:

GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( tmp.hs, interpreted )

tmp.hs:7:1: error:
    Equations for ‘apply’ have different numbers of arguments
      tmp.hs:7:1-17
      tmp.hs:(9,1)-(11,29)
Failed, modules loaded: none.
Haskell假设您在这里编写了三个参数:
s
Var
c
,但是
c
当然属于
Var
数据构造函数。我们可以用一对括号来解决这个问题。此外,您以错误的方式调用
lookup
lookup
具有类型,因此第一个参数是键(这里是
c
),第二个参数是lookup table
s
。因此,我们可以通过以下方法解决此问题:

apply s Var c = -- ...
请注意,您可以去掉
案例
模式匹配,并使用例如:

我们还可以将
Nat
Bool
病例分组:

import Data.Maybe(fromMaybe)

apply :: Substitution -> Type -> Type
apply s Nat = Nat
apply s Bool = Bool
apply s d@(Var c) = fromMaybe d (lookup c s)
当然,如果
Type
不是
Var c
模式,我们应该返回
Type


也许您还需要递归调用
apply
,因为替换可能导致另一个
Var
(因此您必须进行额外的查找)。但是,这将改变函数的语义(!),因此我不确定这是否是一个要求。

您能显示完整的错误吗?我的第一个猜测是,这是一个间距问题。我无法在本地重现该错误,但是还有另一个错误:您忘记在
Var c
周围放括号。前奏曲>:l unify.hs[1/1]编译unify(unify.hs,expressed)unify。hs:43:17:错误:解析输入“Just”时的错误失败,加载的模块:无。在
Nothing
行中有一个制表符。不要混合使用制表符和空格。GHC应该对选项卡发出警告——如果没有,则打开警告。您能显示完整的错误吗?我的第一个猜测是,这是一个间距问题。我无法在本地重现该错误,但是还有另一个错误:您忘记在
Var c
周围放括号。前奏曲>:l unify.hs[1/1]编译unify(unify.hs,expressed)unify。hs:43:17:错误:解析输入“Just”时的错误失败,加载的模块:无。在
Nothing
行中有一个制表符。不要混合使用制表符和空格。GHC应该对选项卡发出警告——如果没有,则打开警告。