我的任务:定义一个功能,该功能可将给定单词重复n次
repliNow :: Integer -> String -> String
哪个给我
beginner.hs:1:1:错误: “ repliNow”的类型签名缺少随附的绑定 | 1 | repliNow ::整数->字符串->字符串 | ^^^^^^^^^
我该如何解决?
答案 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 concat, recursion, lists, fromIntegral
最后一点:函数签名/定义是一种快速查看和理解代码片段应该做什么的好方法,但是只有IMPLEMENTATION才能显示出它的实际作用。