Haskell 获取错误:在输入上解析错误‘;只是’;
但是编译器给了我一个错误“error:parse error on input'Just' "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
我做错了什么?关于要应用的参数数量和查找中的类型,我遇到了一个错误,但此代码类型检查:
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 tables
。因此,我们可以通过以下方法解决此问题:
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 tables
。因此,我们可以通过以下方法解决此问题:
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应该对选项卡发出警告——如果没有,则打开警告。