4

我可以定义这样的函数

method1 :: Int -> Int -> Int
method1 a b = a + b

main = print $ 1 `method1` 2

如果我不想每次调用函数时都使用``,但我想以中缀形式使用它,我该怎么做?

method1 :: Int -> Int -> Int
method1 a b = a + b

main = print $ 1 method1 2
4

2 回答 2

9

简短的回答是,你不能。a b c想象一下if的可怕歧义b可能是中缀。但是您可以定义一个运算符来为您执行此操作。这些中的任何一个都可以

a |+| b   = method1
(|+|) a b = method1 a b 
(|+|)     = method1

然后

a |+| b === a `method1` b === method1 a b

haskell 的中缀运算符允许的字符是有限的,从

:|!@#$%^&*-+./<>?\~

一个通用库,lens,有很多操作符作为更长名称的同义词。这很常见。不过请务必使用判断,否则您最终会得到比 Haskell 更多的 perl :)

于 2013-09-04T04:03:23.000 回答
2

对此有一个卑鄙而讨厌的“解决方案” - 使用 CPP 宏。例如:

{-# LANGUAGE CPP #-}

#define method1 `themethod`
module Main where

themethod x y = x + y

someValue = 3 method1 4

这编译,在 ghci 中,someValue将等于 7。但是请不要这样做......

于 2013-09-04T10:53:50.227 回答