List 函数,该函数获取一个Int并返回一个列表

List 函数,该函数获取一个Int并返回一个列表,list,haskell,functional-programming,List,Haskell,Functional Programming,我在Haskell做了一个练习,需要创建各种类型。第一种类型称为Finite,定义如下: type Finite a = [a] 然后我需要返回一个定义如下的单例 singleF :: a -> Finite a 所以我就这样实现了: single n = [n] 然后我创建了另一个类型 type Enumeration a = Int -> Finite a 然后我需要重新实现singleton函数 singleE :: a -> Enumeration a 在我的

我在Haskell做了一个练习,需要创建各种类型。第一种类型称为Finite,定义如下:

type Finite a = [a]
然后我需要返回一个定义如下的单例

singleF :: a -> Finite a
所以我就这样实现了:

single n = [n]
然后我创建了另一个类型

type Enumeration a = Int -> Finite a
然后我需要重新实现singleton函数

singleE :: a -> Enumeration a
在我的理解中,类型
枚举
是从Int到类型
a
列表的函数的同义词,但我不知道如何准确地实现它

根据练习(前面的类型“Finite”也称为“bucket”):
枚举是有限bucket的无限序列,由自然数索引


函数single:
为了简单起见,我建议将唯一的项放在bucket 0中,因此我认为int是枚举中bucket的索引

singleE :: a -> Enumeration a
singleE a 0 = singleF a
singleE _ _ = []

main :: IO ()
main = do
  let s=singleE 'a'
  print $ s 0
  print $ s 5
给予


singleE为您提供了一个函数,该函数接受Int并返回一个Finite。如果传递0,则得到一个带有单个元素的有限元素,否则为空元素。

有许多不同的方法可以做到这一点–您希望枚举具有哪些属性?(如果整数决定列表长度、最大长度、起始位置……或完全不同的东西?@leftaroundaounda与练习(前面的类型“Finite”也称为“bucket”):
枚举是有限bucket的无限序列,通过自然数进行索引。
和函数single:
为简单起见,我建议您将唯一的项放入bucket 0中
,所以我认为,
int
是枚举中存储桶的索引。您应该将该信息编辑到问题中。无论如何,您都会想要
singleE::enumeration a
。@chepner该练习清楚地表明singleE的定义与我上面写的
singleE::a->enumeration a
不是
singleE
它的定义是这样的:它是一个接受
a
并返回一个返回列表的函数?哦,我想我现在明白了!我可以像这样替换
singleE::a->Int->Finite a
,这意味着我现在也可以得到
Int
!非常感谢你@EliBraginskiy另一种方法是返回lambda:
singleE a=\n->如果n==0,那么singleF a else[]
(您也可以使用
case
而不是
if
)@chi我非常喜欢这个解决方案。有没有办法用
语法来代替它?@EliBraginskiy是的,但我认为它实际上更具可读性<代码>单例a=bool(单例a)[]。(==0)
(首先导入
Data.Bool
)。您也可以删除
a
参数,但是事情会变得非常混乱。不应不惜一切代价遵循无点模式。
"a"
""