【问题标题】:Haskell - fast naming of projection functionsHaskell - 投影函数的快速命名
【发布时间】:2019-04-05 06:30:07
【问题描述】:

假设我想根据其他一些预定义函数g 定义一个函数f,如下所示:

f :: Int -> Int -> Int
f 2 b = g b
f _ _ = 1

也就是说,我想定义投影,f(2,_) : Int->Intg(_) : Int->Int 相同。令人高兴的是,Haskell 具有一流的功能,因此像下面的 squarePlusOne 这样的定义是有效和标准的:

plusOne :: Int -> Int
plusOne i = i+1
square :: Int -> Int
square i = i*i
squarePlusOne :: Int -> Int
squarePlusOne = plusOne . Square

使用 Haskell 的柯里化(即 f 只接受一个 Int 作为输入并返回一个 (Int->Int) 类型的函数),我很惊讶我不能写

f 2 = g

为什么不呢?还是有其他语法?

【问题讨论】:

  • 真的,为什么不呢?您收到任何错误消息吗?
  • 糟糕!我发现我的问题完全是由另一个问题建立的。

标签: haskell currying function-composition first-class-functions


【解决方案1】:

确实,写f 2 = g 是定义f 的有效方式。但是,当以这种方式定义函数时,请记住您必须使用相同的模式签名定义整个函数。也就是说,您可能不会通过编写来耗尽您的功能

f 2 = g
f i j = i+j

相反,可以这样实现:

f 2 = g
f i = (\j-> i+j)

【讨论】:

  • 当然,为了匹配 OP 的原始定义,部分行应该是f _ = \_ -> 1? (哦,抱歉,直到我发表评论后,我才意识到你 OP :))
  • 这也只是f i = (i +)
【解决方案2】:

您可以使用const 函数,该函数创建一个忽略其参数以返回固定值的函数。

f :: Int -> Int -> Int
f 2 = g            -- f 2 x = g x
f _ = const 1      -- f _ x = const 1 x == (\_ -> 1) x == 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2013-07-19
    相关资源
    最近更新 更多