如何编写不带参数的Haskell函数?

时间:2018-09-15 23:56:01

标签: haskell

我有一个名为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))实例

2 个答案:

答案 0 :(得分:9)

目前尚不清楚什么是正确的解决方案,因为对我来说确切的含义还不是很清楚。这是您想要的一些可能的解释。

  • 您希望e6等于常量5,该常量是通过求值2+3计算得出的。由于这不是函数,因此不应在其签名中使用函数类型。

    e6 :: Int
    e6 = 2 + 3
    
  • 您希望e6add一样是一个函数,但是总是返回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会话所演示的那样。