Haskell “如何制作一个类型匹配”;具有Int“类型的单个元素的列表;?

Haskell “如何制作一个类型匹配”;具有Int“类型的单个元素的列表;?,haskell,Haskell,我目前正在Haskell编写我的第一个程序 在我正在使用的规范中,[0]5用于定义可以写入的MAC密钥“\x00\x00\x00\x00\x00\x00”::ByteString 我有点喜欢重用这个符号的想法(尽管从编程的角度来看它没有什么意义)。最终,编写mackey,使mackey[0]5做正确的事情是非常简单的 剩下的唯一问题是如何定义我的输入类型,以便它强制使用带有单个整数元素的列表。这可能吗 NB:通常情况下,我不会为这件事操心太多。在这种情况下,我甚至不应该使用列表:一个简单的In

我目前正在Haskell编写我的第一个程序

在我正在使用的规范中,
[0]5
用于定义可以写入的MAC密钥
“\x00\x00\x00\x00\x00\x00”::ByteString

我有点喜欢重用这个符号的想法(尽管从编程的角度来看它没有什么意义)。最终,编写
mackey
,使
mackey[0]5
做正确的事情是非常简单的

剩下的唯一问题是如何定义我的输入类型,以便它强制使用带有单个整数元素的列表。这可能吗



NB:通常情况下,我不会为这件事操心太多。在这种情况下,我甚至不应该使用列表:一个简单的
Int
就足够了,可以“强制”我所需要的一切;所以我知道正确的方法是使用一个简单的整数。但这是探索Haskell类型系统可以做什么(或不做什么)的一个非常好的方法。:)

正如您自己所观察到的,一个
Int
就可以完成所需的功能,这可能是一个不错的选择。如果你不想要列表,就不要使用列表

也就是说,使用普通的
Int
也可能不是最好的选择。也许你想弄清楚每个论点的含义。为此,您可以为
Int
创建别名并相应地调用它:

newtype KeyWord = KeyWord Int

macKey :: KeyWord -> Int -> MAC
在这种情况下,调用站点的语法将是
macKey(关键字0)5

可以再缩短一点,但这可能不值得。事实上,即使是
newtype
也可能有些过分——主要的好处是类型签名变得更加明确,但对于调用函数来说,这基本上是样板文件。简单的类型别名可能就足够了:

type KeyWord = Int
然后您可以再次写入
macKey 0 5
,同时保留清晰的签名

如果需要以简洁的方式写出大量的密钥,可以考虑制作<代码> MAKEY < /C> >和中缀运算符:

infix 7 #*
(#*) :: KeyWord -> Int -> MAC

然后写
0#*5

听起来像是你在寻找的,但这不是“标准”Haskell的一部分。看看这里:太棒了!这种灵活性。这给了我一些想法!谢谢。你也可以引用@Eugene_Sh.对固定长度列表的评论吗?那我就接受你的回答这样的固定长度列表对您的应用程序毫无用处。毕竟,你的问题不是关于单元素压缩列表,而是关于方括号的语法。。。事实上,它更多地与类型系统有关。我刚刚想出了一个(真实的)例子,想“哦,这个符号很简洁,有可能(ab)以这种方式使用Haskell类型的系统吗?”。因此,虽然我理解从编程的角度来看这毫无意义,但对这样一个简单的案例进行推理要比对实际生活中的复杂案例进行推理容易得多,因为在这些案例中,使用固定长度列表实际上是有意义的。话虽如此,您所写的显然是有意义的。好吧,Haskell的语法是灵活的,但某些东西是硬的,包括
[]
用于列表(或者,对于类似列表的类型,例如数组)。如果您想对完全不同的内容使用方括号语法,则需要不同的语法环境。例如,您可以使用编写语法分析器,并使用Quasikote将其嵌入Haskell文件中。顺便说一句,您可以滥用
OverloadedList
来编写
[0]::关键字
,但当有人编写
macKey[]2
macKey[32542]3
时,这将导致运行时错误。