如何设置匹配“具有Int类型的单个元素的列表”的类型?

时间:2017-06-20 14:54:36

标签: haskell

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

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

我有点喜欢重复使用这种符号的想法(尽管从编程的角度来看它没什么意义)。最后写mackey以便mackey [0] 5做正确的事情就足够了。

唯一的问题是如何定义我的输入类型,以便强制使用带有单一 整数元素。这甚至可能吗?

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

1 个答案:

答案 0 :(得分:3)

正如您自己观察到的那样,单个Int 完全符合您的需要,并且可能是最佳选择。如果您不想要列表,请不要使用列表!

尽管如此,使用普通Int可能也不是最好的。也许你想清楚每个论点的含义是什么。您可以为此目的为Int创建一个别名并相应地调用它:

newtype KeyWord = KeyWord Int

macKey :: KeyWord -> Int -> MAC

在这种情况下,呼叫站点的语法将为macKey (KeyWord 0) 5

有可能缩短一点,但它可能不值得。事实上,即使newtype可能有点过分 - 主要的好处是类型签名变得更加明确,但是为了调用函数,这主要是样板文件。一个简单的类型别名可能就足够了:

type KeyWord = Int

然后您可以在保留明确签名的同时再次编写macKey 0 5

如果您需要以简洁的方式写出大量的密钥,您可以考虑制作macKey和中缀运算符:

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

然后写下0#*5