2012-02-29 142 views
13

这两个函数有区别吗?Haskell:(+1)和( x-> x + 1)有什么区别?

ghct说:

Prelude> :t (+1) 
(+1) :: Num a => a -> a 
Prelude> :t \x->x+1 
\x->x+1 :: Num a => a -> a 

但是

当我使用(1)的语法在这段代码:

data B = B { 
    pos :: Int, 
    cells :: [Int] 
} deriving (Show) 

createB :: Int -> B 
createB n = B 0 (take n $ repeat 0) 

size :: B -> Int 
size b = length $ cells b 

get_curr :: B -> Int 
get_curr b = (cells b) !! (pos b) 

apply :: (Int -> Int) -> B -> B 
apply f b = let n = pos b 
       h = take n $ cells b  -- head 
       t = drop (n + 1) $ cells b -- tail 
       in B n $ h ++ [f (get_curr b)] ++ t 

-- ... 
eval :: [Char] -> StateT B IO() 
eval [] = return() 
eval (x:xs) = do 
       b <- get 

       put $ case x of 
         '+'   -> apply (+1) b 
         '-'   -> apply (-1) b 
         '>'   -> fwd b 
         '<'   -> back b 
         otherwise -> b 
       -- ... 

前奏(以及编译器),所述:

> :load BrainFuck.hs 
[1 of 1] Compiling BrainFuck  (BrainFuck.hs, interpreted) 

BrainFuck.hs:49:40: 
    No instance for (Num (Int -> Int)) 
     arising from the literal `1' 
    Possible fix: add an instance declaration for (Num (Int -> Int)) 
    In the expression: 1 
    In the first argument of `apply', namely `(- 1)' 
    In the expression: apply (- 1) b 
Failed, modules loaded: none. 

我在做什么错? 对不起,如果代码是不那么酷(完整源在这里:https://github.com/nskeip/bf/blob/a755b2d27292593d63fe1e63c2a6e01cebc73520/BrainFuck.hs

回答

22

此代码:

(-1) 

...并不意味着同样的事情,因为这代码:

\ x -> x - 1 

-是在Haskell特殊情况;它是该语言中唯一的前缀运算符。当你写(-1)时,你会得到一个“负数”,而不是“减一个”,这是一个函数。

你应该使用subtract 1来得到你所需要的。

+4

您也可以使用'pred',但请注意'predminBound'会抛出一个异常,而'subtract 1 minBound'将环绕。 – hammar 2012-02-29 18:42:50

11

你的问题不在于(+1),它与(-1)

Prelude> :t (-1) 
(-1) :: Num a => a 

-1 is a number!试着用apply (\x -> x-1) bapply (subtract 1) b

+0

该死! )))) – 2012-02-29 18:16:18

+0

因为你不需要*一个/前缀'+',所以没有。 – delnan 2012-02-29 18:19:07

+0

请参阅“中缀运算符的部分”的链接 – Joni 2012-02-29 18:19:12

4

(+1)\x -> x + 1之间没有区别,如果仔细观察,(+1)不是导致您的错误的原因。 (-1)是。这是因为不像(+1)(-1)不是运营商部分,它是负值。

4

而不是subtract减量表达式也可以直接写为(+(-1))

相关问题