-1

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

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

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

4

2 回答 2

4

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

f 2 = g
f i j = i+j

相反,这可以像这样实现:

f 2 = g
f i = (\j-> i+j)
于 2019-04-05T07:10:59.503 回答
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
于 2019-04-05T14:47:13.537 回答