計算機科学のブログ

関数型プログラミングの基礎 ラムダ関数とレキシカルスコープ 入れ子

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON 3(ラムダ関数とレキシカルスコープ)、3.6(練習問題)Q3-2の解答を求めてみる。

コード

counter :: Num p => p -> p
counter x =
    (\x ->
        (\x -> x) (x + 1)
    )(x + 1)

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /.../.ghc/ghci.conf
Prelude
λ> :load sample
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, one module loaded.
(0.03 secs,)
*Main
λ> counter 0
2
it :: Num p => p
(0.02 secs, 62,384 bytes)
*Main
λ> counter 1
3
it :: Num p => p
(0.01 secs, 60,072 bytes)
*Main
λ> counter 5
7
it :: Num p => p
(0.00 secs, 60,072 bytes)
*Main
λ> counter -5

<interactive>:5:1: error:
    • Non type-variable argument in the constraint: Num (p -> p)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall p. (Num p, Num (p -> p)) => p -> p
(0.01 secs,)
*Main
λ> counter (-5)
-3
it :: Num p => p
(0.00 secs, 60,896 bytes)
*Main
λ> :q
Leaving GHCi.
%