我正在学习Haskell,在掌握了一些基础知识后,我决定解决HackerRank中的一些简单问题。但我很快发现自己陷入困境。
功能问题中的问题7被称为" N个元素的数组"
我们应该为给定的n返回n个元素的任何数组。如果n是Int,那么这将非常简单,但它被读作IO Int
。我还没有真正理解monad的概念。我为类型签名为IO Int -> Int
的函数提供了问题,并找到了unsafePerform IO,但它抛出了这个:
Couldn't match expected type ‘t0 -> t’
with actual type ‘[Integer]’
我不太了解t0和t的类型。
感谢任何帮助。
链接:https://www.hackerrank.com/challenges/fp-array-of-n-elements/problem
答案 0 :(得分:4)
该网站上的fn
输入 Int
。你从根本上误解了这里使用的记号。
main = do
n <- readLn :: IO Int
print (fn(n))
第二行并未说n
的类型为IO Int
。它说readLn
的类型为IO Int
,然后 IO
monad中的绑定到n
。因此n
的类型为Int
。将您的函数写为fn :: Int -> [Int]
,您就可以了。在这次挑战中无需担心IO
。
你可以阅读更多关于do-notation here的内容,但除非你经历过涵盖monad的Haskell教程,否则它可能没有多大意义。