List Haskell:是否可以定义一个可以封装的数据类型,String&;具备应用价值的双重能力?

List Haskell:是否可以定义一个可以封装的数据类型,String&;具备应用价值的双重能力?,list,haskell,list-comprehension,applicative,List,Haskell,List Comprehension,Applicative,我是一个Haskell初学者,在构建一个简单的项目时,我遇到了这个奇怪的问题 我有一个功能列表,例如 [f1, f2, f3 ... fn] 这不起作用,因为它们没有相同的类型。有些有Ct->String,Ct->Double和Ct->可能是Double 我想做的是像这样应用函数 [f1, f2, f3 ... fn] <*> [v1, v2, v3 ... vn] 但是n是一个相当大的数字,您必须定义一个单独的show实例来表示在终端上打印它们,这是我想要做的事情之一 我知

我是一个Haskell初学者,在构建一个简单的项目时,我遇到了这个奇怪的问题

我有一个功能列表,例如

[f1, f2, f3 ... fn] 
这不起作用,因为它们没有相同的类型。有些有
Ct->String
Ct->Double
Ct->可能是Double

我想做的是像这样应用函数

[f1, f2, f3 ... fn] <*> [v1, v2, v3 ... vn] 
但是
n
是一个相当大的数字,您必须定义一个单独的show实例来表示在终端上打印它们,这是我想要做的事情之一


我知道一些克服这个问题的方法,一种是使用元组,但将结果分成更小的块,但我想知道,有没有一种方法可以定义一个数据类型,它可以封装多个数据类型,并且仍然保留应用程序风格的“惯用性”和可读代码?

列出三种类型的列表
[Ct->String]
[Ct->Double]
,以及
[Ct->可能是Double]
。每种方法都可以适用于您的
[Ct]

两种备选解决方案浮现在脑海中,并立即被丢弃:一种新的数据类型,它可以保存
字符串
、一种
双精度
、或者一种
可能双精度
;或存在主义,本质上只是对同一理念的更统一的包装。想法一是这样的:

data Weird
    = It'sAString String
    | It'sADouble Double
    | It'sAMaybe (Maybe Double)
然后您将使用例如
[It'sAString.f1、It'sADouble.f2、It'sAMaybe.f3]
,它的类型为
[Ct->Weird]
,可以应用。对我来说,这似乎已经超过了它的价值,特别是考虑到你的消费者现在必须准备好处理这三个构造器中的任何一个


存在的方式可能更糟:您可能想要识别(或创建)一个类,该类涵盖了您可以使用
字符串
Double
、或
可能Double
,并合理地统一了所有三种类型,首先。哎哟你可能想做的事情太多了,这才有意义。

列出三种类型的列表,分别是
[Ct->String]
[Ct->Double]
,和
[Ct->Maybe Double]
。每种方法都可以适用于您的
[Ct]

两种备选解决方案浮现在脑海中,并立即被丢弃:一种新的数据类型,它可以保存
字符串
、一种
双精度
、或者一种
可能双精度
;或存在主义,本质上只是对同一理念的更统一的包装。想法一是这样的:

data Weird
    = It'sAString String
    | It'sADouble Double
    | It'sAMaybe (Maybe Double)
然后您将使用例如
[It'sAString.f1、It'sADouble.f2、It'sAMaybe.f3]
,它的类型为
[Ct->Weird]
,可以应用。对我来说,这似乎已经超过了它的价值,特别是考虑到你的消费者现在必须准备好处理这三个构造器中的任何一个


存在的方式可能更糟:您可能想要识别(或创建)一个类,该类涵盖了您可以使用
字符串
Double
、或
可能Double
,并合理地统一了所有三种类型,首先。哎哟你可能想做的事情太多了,这才有意义。

最终的列表不会有不同的类型吗?或者您的意思是单独申请
[Ct]
?在打印它们的同时,我还想对最终结果使用
sortBy(比较某些函数)
。这是否意味着我将不得不走你在第3段和第4段中提到的复杂道路?@atis你所指的“最终清单”是什么?你绝对不必走任何复杂的道路;您可以而且应该遵循第一段中描述的路径。我把另外两个也包括进来只是为了完整性,而且有点迫不得已。我的思维过程是建立一个元组列表,就像问题中的元组一样,具有各种类型的所有值,并根据每个元组的第二个和第三个值对元组列表进行排序,这将是
Double
。这就是为什么我认为我需要以某种方式连接输出!
String
是整个数据元组的一种名称。所谓最终列表,我指的是
[doubleF1,doubleF2][stringF1,stringF2][v1,v2..vn]
@atis的结果。我认为您试图将问题从细节中抽象出来,以便更具普遍意义,这是令人钦佩的,但抽象正在泄漏。把你的问题具体化,让它显示出你真正需要的东西。最终的列表不会有不同的类型吗?或者您的意思是单独申请
[Ct]
?在打印它们的同时,我还想对最终结果使用
sortBy(比较某些函数)
。这是否意味着我将不得不走你在第3段和第4段中提到的复杂道路?@atis你所指的“最终清单”是什么?你绝对不必走任何复杂的道路;您可以而且应该遵循第一段中描述的路径。我把另外两个也包括进来只是为了完整性,而且有点迫不得已。我的思维过程是建立一个元组列表,就像问题中的元组一样,具有各种类型的所有值,并根据每个元组的第二个和第三个值对元组列表进行排序,这将是
Double
。这就是为什么我认为我需要以某种方式连接输出!
String
是整个数据元组的一种名称。所谓最终列表,我指的是
[doubleF1,doubleF2][stringF1,stringF2][v1,v2..vn]
@atis的结果。我认为您试图将问题从细节中抽象出来,以便更具普遍意义,这是令人钦佩的,但抽象正在泄漏。让你的问题足够具体,以显示你真正需要的东西。“应用的”,而不是“欣赏的”。“应用的”,而不是“欣赏的”。