Haskell 如何定义具有不同类型输入和输出的函数?
我尝试了以下代码:Haskell 如何定义具有不同类型输入和输出的函数?,haskell,Haskell,我尝试了以下代码: data InputType=NumType Int | StrType字符串 数据输出类型=整数或字符串 添加“::输入类型->输入类型->输出类型 添加“(数值类型a b)=a+b 添加“(StrType a b)=a++b 但失败了:(您对输出类型的声明没有指定它可以是Int或字符串;相反,您创建了一个新的对,它需要Int和字符串。您的数据构造函数或者恰好与类型构造函数同名er 我想你是说 type OutputType = Either Int String 在这
data InputType=NumType Int | StrType字符串
数据输出类型=整数或字符串
添加“::输入类型->输入类型->输出类型
添加“(数值类型a b)=a+b
添加“(StrType a b)=a++b
但失败了:(您对
输出类型的声明
没有指定它可以是Int
或字符串
;相反,您创建了一个新的对,它需要Int
和字符串
。您的数据构造函数或者恰好与类型构造函数同名er
我想你是说
type OutputType = Either Int String
在这种情况下,如果使用正确的构造函数,就可以定义函数
add' :: InputType -> OutputType
add' (NumType a b) = Left (a + b)
add' (StrType a b) = Right (a ++ b)
您的OutputType
声明没有指定它可以是Int
或String
;相反,您创建了一个新的对,它需要Int
和String
。您的数据构造函数或恰好与类型构造函数或具有相同的名称ode>
我想你是说
type OutputType = Either Int String
在这种情况下,如果使用正确的构造函数,就可以定义函数
add' :: InputType -> OutputType
add' (NumType a b) = Left (a + b)
add' (StrType a b) = Right (a ++ b)
您可以使用GADT在值级别表示您获得的输入类型:
{-# LANGUAGE GADTs #-}
module Add where
data SType a where
SString :: SType String
SInt :: SType Int
add :: SType a -> a -> a -> a
add SString = (++)
add SInt = (+)
我调用GADTSType
,因为它是一个。您可以使用GADT在值级别表示您得到的输入类型:
{-# LANGUAGE GADTs #-}
module Add where
data SType a where
SString :: SType String
SInt :: SType Int
add :: SType a -> a -> a -> a
add SString = (++)
add SInt = (+)
我调用了GADTSType
,因为它是a。•无法将预期类型“InputType->OutputType”与实际类型“other Int b0”匹配•可能原因:“Left”应用于表达式中的太多参数:“add”的等式中的Left(a+b):add(NumType a-b)=左(a+b)
@gongqj问题是您给出的签名add'
。对于您编写的函数,它应该是add'::InputType->OutputType
哦,我以前忘记更改签名了。谢谢您的回复。现在,定义是正确的,但调用add'$NumType 12
数据构造函数时仍然失败,不在作用域:NumInput::Integer->Integer->InputType看起来您键入的是NumInput
而不是NumType
。抱歉,我刚刚重构了类型名称,然后看到了您的回复,因此出现了一个键入错误。•无法将预期的类型“InputType->OutputType”与实际类型“Orther Int b0”匹配•可能的原因是:se:“Left”应用于表达式中的太多参数:“add”表达式中的Left(a+b):add(NumType a b)=Left(a+b)
@gongqj问题是您给出的签名add'
。对于您编写的函数,它应该是add'::InputType->OutputType
哦,我以前忘记更改签名了。谢谢您的回复。现在,定义是正确的,但调用add'$NumType 12
数据构造函数时仍然失败,不在作用域:NumInput::Integer->Integer->InputType看起来您键入的是NumInput
,而不是NumType
。对不起,我刚刚重构了类型名称,然后看到了您的回复,所以有一个输入错误。如果这不仅仅是一个练习,请注意,您的特定问题可以通过类解决:例如,您可以尝试在GHCi中,importData.Monoid
后跟“foo”“bar”
和Sum 2 Sum 3
。如果这不仅仅是一个练习,请注意您的特定问题可以通过类解决:例如,您可以尝试在GHCi中导入数据。Monoid
后跟“foo”“bar”
和Sum 2 Sum 3
。