Я пытаюсь написать функцию, тип возвращаемого значения которой зависит от значения одного из ее входных данных.
В Идрисе это просто:
module Dependent
IntOrChar : Bool -> Type
IntOrChar True = Int
IntOrChar False = Char
fun : (x : Bool) -> IntOrChar x
fun True = 10
fun False = 'a'
С этими определениями:
λΠ> fun True
10 : Int
λΠ> fun False
'a' : Char
У меня вопрос: могу ли я сделать подобное простым способом в Haskell?
Полагаю, я мог бы использовать что-то вроде синглетонов , но я не знаю, как правильно их использовать.
Это работает:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Data.Singletons.Prelude
type family IntOrChar (x :: Bool) where
IntOrChar True = Int
IntOrChar False = Char
fun :: SBool b -> IntOrChar b
fun b = case b of
STrue -> 10
SFalse -> 'a'
...
λ fun STrue
10
λ fun SFalse
'a'
Но это требует, чтобы я использовал SBool
с вместо простых Bool
с. Я бы предпочел использовать его как fun True
.
Есть ли способ сделать эквивалент в fun : (x : Bool) -> IntOrChar x
в Haskell?