Haskell—投影函数的快速命名

Haskell—投影函数的快速命名,haskell,currying,function-composition,first-class-functions,Haskell,Currying,Function Composition,First Class Functions,假设我想根据其他预定义函数g定义函数f,如下所示: f :: Int -> Int -> Int f 2 b = g b f _ _ = 1 也就是说,我想定义投影f2,quo:Int->Int与g_quo:Int->Int相同。令人高兴的是,Haskell有一流的函数,所以像以下squarePlusOne这样的定义是有效的和标准的: plusOne :: Int -> Int plusOne i = i+1 square :: Int -> Int square i

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

f :: Int -> Int -> Int
f 2 b = g b
f _ _ = 1
也就是说,我想定义投影f2,quo:Int->Int与g_quo: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的currying ie.f只接受一个Int作为输入,并返回一个Int->Int类型的函数,我很惊讶我无法编写

f 2 = g
为什么不呢?或者还有其他语法吗?

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

f 2 = g
f i j = i+j
相反,可以这样实现:

f 2 = g
f i = (\j-> i+j)
您可以使用const函数,它创建一个忽略其参数以返回固定值的函数

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

真的,为什么不呢?你收到错误信息了吗?哎呀!我发现我的问题完全是由另一个问题引起的。当然,为了符合OP的原始定义,剖面线应该是f \=\\ \ \->1?哦,对不起,直到我评论之后我才意识到你是OP:那也只是f I=I+。