計算機科学のブログ

型によるプログラミング 合成によるデザイン:SemigroupとMonoid Semigroup:似ている型を組み合わせる <>演算子

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT3(型によるプログラミング)、LESSON 17(合成によるデザイン:SemigroupとMonoid)、17.2(Semigroup:似ている型を組み合わせる)、クイックチェック 17-2の解答を求めてみる。

可能ではない。

Int型とInt型の除算の結果がInt型になるとは限らないから。例えば 2/1、4/2等は2、2とInt型になるけど、2/3、4/3はInt型にならない。

実際に確認。

コード

lesson/app/Main.hs

module Main where

import Lib

main :: IO ()
main = return ()

lesson/src/Lib.hs

module Lib where

import Data.Semigroup

instance Semigroup Int where
  (<>) x y = x / y

入出力結果(Terminal, Zsh)

% stack build
lesson-0.1.0.0: unregistering (local file changes: src/Lib.hs)
lesson> build (lib + exe)
Preprocessing library for lesson-0.1.0.0..
Building library for lesson-0.1.0.0..
[2 of 2] Compiling Lib

/Users/…/lesson/src/Lib.hs:6:16: error:
    • No instance for (Fractional Int) arising from a use of ‘/’
    • In the expression: x / y
      In an equation for ‘<>’: (<>) x y = x / y
      In the instance declaration for ‘Semigroup Int’
  |
6 |   (<>) x y = x / y
  |                ^

--  While building package lesson-0.1.0.0 (scroll up to its section to see the error) using:
      /Users/…/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_3.4.1.0_ghc-9.0.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-3.4.1.0 build lib:lesson exe:lesson-exe --ghc-options " -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1
%