Haskell-类型签名缺少随附的绑定

时间:2018-09-11 10:47:49

标签: haskell

我的任务:定义一个功能,该功能可将给定单词重复n次

repliNow :: Integer -> String -> String

哪个给我

  

beginner.hs:1:1:错误:       “ repliNow”的类型签名缺少随附的绑定     |   1 | repliNow ::整数->字符串->字符串     | ^^^^^^^^^

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您尚未定义函数,但已提供类型签名。因此,编译器告诉您尚未定义函数。

如果您读到错误,它将清楚地告诉您,如果您知道'binding'意味着'definition':

  

‘repliNow’的类型签名缺少附带的绑定。

从本质上讲,这是编译器在询问“好,repliNow是这种类型,但实际上是什么?”就像有人说“ a是一个数字”,您可能会问“好,但是它有什么价值?”

定义功能,该错误将消失。这是以下形式:

repliNow int str = -- your implementation here.

答案 1 :(得分:0)

我想我了解您的意思...我经常将::符号读为“被定义为”,这是阅读该函数的好方法。是的,您正确定义了该函数。 repliNow :: :: Integer-> String-> String可以读作:“ repliNow被定义为将Integer和String作为输入然后输出String的函数”。但是,如果只是将其放入haskell源代码文件中并尝试运行它,则GHC会抱怨,因为正如其他答案所述,您只是给出了签名而不是实现。因此,您已经完成了签名定义的一半努力,并且对于实现而言,有很多成功的途径,例如使用递归:

repliNow :: Integer -> String -> String
repliNow 0 _   = ""
repliNow n str = str ++ repliNow (n-1) str

或者也许您想获得花哨的wif函数:

repliNow :: Integer -> String -> String
repliNow n str = concat $ replicate (fromIntegral n) str

我建议您查看这些资源以进一步了解Haskell的专有技术:

replicate and concatrecursionlistsfromIntegral

最后一点:函数签名/定义是一种快速查看和理解代码片段应该做什么的好方法,但是只有IMPLEMENTATION才能显示出它的实际作用。