我目前正在Haskell编写我的第一个程序。
在我正在使用的规范中,[0] 5
用于定义可以写成"\x00\x00\x00\x00\x00"::ByteString
的MAC密钥。
我有点喜欢重复使用这种符号的想法(尽管从编程的角度来看它没什么意义)。最后写mackey
以便mackey [0] 5
做正确的事情就足够了。
唯一的问题是如何定义我的输入类型,以便强制使用带有单一 整数元素。这甚至可能吗?
注意:通常情况下,我不会太在意这件事。在这种情况下我甚至不应该使用列表:简单的Int
就足够了并“强制执行”我需要的一切;所以我知道正确的方法是使用一个简单的整数。但这是探索Haskell类型系统可以做什么(或不做)的非常好的方法。 :)
答案 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
。