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    = (+)

我调用GADT
SType
,因为它是一个。您可以使用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    = (+)

我调用了GADT
SType
,因为它是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