計算機科学のブログ

関数型プログラミングの基礎 ラムダ関数とレキシカルスコープ ラムダ関数 独自のwhere句の記述 無名関数、匿名関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON 3(ラムダ関数とレキシカルスコープ)、3.1(ラムダ関数)のクイックチェック3-1、3.2(独自のwhere句を記述する)のクイックチェック3-2の解答を求めてみる。

コード

-- Q3-2
doubleDouble :: Num a => a -> a
doubleDouble x = (\a -> a) x * 2

入出力結果(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
λ> \x -> 2 * x

<interactive>:1:1: error:
    • No instance for (Show (Integer -> Integer))
        arising from a use of ‘print’
        (maybe you haven't applied a function to enough arguments?)
    • In a stmt of an interactive GHCi command: print it
(0.01 secs,)
Prelude
λ> (\x -> 2 * x) 0
0
it :: Num a => a
(0.00 secs, 62,128 bytes)
Prelude
λ> (\x -> 2 * x) 1
2
it :: Num a => a
(0.00 secs, 59,800 bytes)
Prelude
λ> (\x -> 2 * x) 5
10
it :: Num a => a
(0.00 secs, 60,552 bytes)
Prelude
λ> (\x -> 2 * x) -5

<interactive>:5:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Num a, Num (a -> a)) => a -> a
(0.00 secs,)
Prelude
λ> (\x -> 2 * x) (-5)
-10
it :: Num a => a
(0.00 secs, 61,376 bytes)
Prelude
λ> :load sample1.hs 
[1 of 1] Compiling Main             ( sample1.hs, interpreted )
Ok, one module loaded.
(0.00 secs,)
*Main
λ> doubleDouble 0
0
it :: Num a => a
(0.00 secs, 59,952 bytes)
*Main
λ> doubleDouble 1
4
it :: Num a => a
(0.00 secs, 59,968 bytes)
*Main
λ> doubleDouble 2
8
it :: Num a => a
(0.00 secs, 59,984 bytes)
*Main
λ> doubleDouble 5
20
it :: Num a => a
(0.00 secs, 60,720 bytes)
*Main
λ> :q
Leaving GHCi.
%