Eva*_*oll 2 haskell inferred-type
使用RWH,第3章问题5请求我创建了一个函数来测试是否存在paldindrome.
我写了这个,但它不起作用
pCheck :: (Eq a) => [a] -> Bool;
pCheck a = take n a == ( take n $ reverse a )
where n = floor ( length a / 2 )
Run Code Online (Sandbox Code Playgroud)
我尝试运行它时遇到此错误:
No instance for (RealFrac Int)
arising from a use of `floor' at len.hs:13:11-32
Possible fix: add an instance declaration for (RealFrac Int)
In the expression: floor (length a / 2)
In the definition of `n': n = floor (length a / 2)
In the definition of `pCheck':
pCheck a = take n a == (take n $ reverse a)
where
n = floor (length a / 2)
Run Code Online (Sandbox Code Playgroud)
我很困惑我做错了什么?我知道一个paldindrome也可以测试a == reverse a,但现在我想找到我的方式错误.
更新:代码中的一个错误是由Justice的建议修复的,问题已更新,以反映剩余的问题
表达方式
take n a == take n $ reverse a
Run Code Online (Sandbox Code Playgroud)
被解析为
(take n a == take n) $ (reverse a)
Run Code Online (Sandbox Code Playgroud)
因为$运营商具有优先权0,甚至低于==运营商.
你需要表达式:
take n a == (take n $ reverse a)
Run Code Online (Sandbox Code Playgroud)
另外,请尊重Haskell并使用length a而不是length (a).你也应该使用length a `div` 2而不是length a / 2.该函数div是整数除法,得到一个整数.