我有一个名为e6
的函数声明。我需要用一些代码替换undefined
并使其起作用。
e6 :: Int -> Int -> Int
e6 = undefined
例如,我知道
add :: Int -> Int -> Int
add a b = a + b
它接受参数a和b,然后返回a + b。但是我怎么写一个没有参数的函数。我尝试过
e6 :: Int -> Int -> Int
e6 = 2 + 3
它说:
没有因使用'+'而引起的(Num(Int-> Int-> Int))实例
答案 0 :(得分:9)
目前尚不清楚什么是正确的解决方案,因为对我来说确切的含义还不是很清楚。这是您想要的一些可能的解释。
您希望e6
等于常量5
,该常量是通过求值2+3
计算得出的。由于这不是函数,因此不应在其签名中使用函数类型。
e6 :: Int
e6 = 2 + 3
您希望e6
像add
一样是一个函数,但是总是返回2+3
而不是a+b
,也就是说,忽略它论据,即使它仍然有它们。这样,类型签名就可以了,但是您需要显式忽略参数。
e6 :: Int -> Int -> Int
e6 _ _ = 2 + 3
-- OR
e6 a b = 2 + 3
您希望e6
在各方面都像add
一样,但是在定义e6
时您不想显式地命名其参数。然后,如果您没有将参数提供给e6
,那么您也将无法将参数提供给+
。所以:
e6 :: Int -> Int -> Int
e6 = (+)
(+)
是用于将中缀运算符转换为前缀函数的特殊语法; \a b -> (+) a b
和\a b -> a + b
的行为大致相同。
答案 1 :(得分:3)
您是否在问如何在point-free style中编写函数?
如果是这样,您可以将加法函数编写为:
e6 = (+)
在这个简单的示例中,e6
只是成为+
运算符的别名。在Haskell中,运算符只是具有特殊名称的函数,并且当您想将它们用作函数而不是运算符时,可以用方括号将它们括起来,如上所述。 (+)
函数(即+
运算符)已经是一个带有两个参数并返回值的函数。
这里有一些GHCi交互作用:
Prelude> :t e6
e6 :: Num a => a -> a -> a
Prelude> e6 1 3
4
Prelude> e6 42 1337
1379
推断的类型为Num a => a -> a -> a
,但它也与Int -> Int -> Int
兼容,因此,如果您希望将类型限制为该类型,则可以使用此受限类型声明函数。不过,没有特殊的原因,因为通用版本也可以与Int
配合使用,正如GHCi会话所演示的那样。