Haskell “someFunction'”的方程;具有不同数量的参数(代码战)

Haskell “someFunction'”的方程;具有不同数量的参数(代码战),haskell,codewars,Haskell,Codewars,我用它来练习/学习Haskell。我很难理解为什么给定的情况适用于我的示例本地代码,而不适用于代码战 关于代码战: module Codewars.Kata.Negative where makeNegative :: (Num a) => a -> a makeNegative x = x + x makeNegative = error "todo: makeNegative" 这给了我: Codewars/Kata/Negative.hs:4:1: Equation

我用它来练习/学习Haskell。我很难理解为什么给定的情况适用于我的示例本地代码,而不适用于代码战

关于代码战:

module Codewars.Kata.Negative where

makeNegative :: (Num a) => a -> a
makeNegative x = x + x
makeNegative = error "todo: makeNegative"
这给了我:

Codewars/Kata/Negative.hs:4:1:
    Equations for `makeNegative' have different numbers of arguments
      Codewars/Kata/Negative.hs:4:1-22
      Codewars/Kata/Negative.hs:5:1-41
但当我在本地进行测试时:

import Data.List
import System.IO

example :: (Num a) => a -> a
example x = x + x
main = do
  print (example(3))

它正确返回6。我甚至不能尝试解决这个问题,因为编译器抱怨参数。我有点明白Num是一个“类型类”,但我不明白它在代码战上的工作方式有什么不同。我想这是因为那里的“where”子句。

问题在于你对
makeNegative的定义。请注意,定义有三行:

makeNegative :: (Num a) => a -> a
makeNegative x = x + x
makeNegative = error "todo: makeNegative"
第一个是类型签名,后面是两个定义。当模式匹配参数和处理不同的情况时,通常会提供多个定义;然而在这种情况下,模式匹配永远不会失败;因此,
错误
行将永远不会运行

不管它永远不会运行;Haskell仍然要求函数的所有实现具有相同数量的绑定参数,
makeNegative x=
绑定一个参数(即
x
);但是第二个定义
makeNegative=
没有绑定任何参数。在这种情况下,它看起来像是一个占位符定义,因此您只需删除带有
错误的行
,它就可以工作了


您的
示例
测试只有一个定义,因此不会遇到此问题。

因为您有一个额外的定义。remove
makeNegative=error“todo:makeNegative”
如果希望第二个子句作为某种占位符,它仍然需要有一个(可能是伪)参数,就像第一个子句一样。比如:
makeNegative\uu=error“todo:makeNegative”
。否则,第2条与类型签名相矛盾。但即使如此,它仍然是无法访问的,因此编译器将以另一种方式进行抱怨。