关于功能的Haskell问题

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的建议修复的,问题已更新,以反映剩余的问题

yfe*_*lum 5

表达方式

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是整数除法,得到一个整数.