計算機科学のブログ

コンテキストでの型の操作 コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる コンテナとテキスト

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(コンテキストでの型の操作)、LESSON29(コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる)、29.2(コンテナとテキスト)、クイックチェック 29-3の解答を求めてみる。

(1, 2)、(3, 4)と(3, 5, 5, 6)は型が異なるから。

実際にはどうなるかを確認。

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /Users/…/.ghc/x86_64-darwin-8.10.7/environments/default
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /Users/…/.ghc/ghci.conf
Prelude
λ> pure (+) <*> (1, 2) <*> (3, 4)

<interactive>:1:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 12 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In a stmt of an interactive GHCi command: print it
(0.08 secs,)
Prelude
λ> pure (+) <*> (1, 2) <*> (3, 4) :: (Int, Int)

<interactive>:2:1: error:
    • No instance for (Monoid Int) arising from a use of ‘<*>’
    • In the expression: pure (+) <*> (1, 2) <*> (3, 4) :: (Int, Int)
      In an equation for ‘it’:
          it = pure (+) <*> (1, 2) <*> (3, 4) :: (Int, Int)
(0.01 secs,)
Prelude
λ> pure (+) <*> (1, 2) <*> (3, 4) :: (Int, Int, Int, Int))

<interactive>:3:1: error:
    Invalid type signature: pure (+) <*> (1, 2) <*> (3, 4) :: ...
    Should be of form <variable> :: <type>
Prelude
λ> :quit
Leaving GHCi.
%