【发布时间】:2018-12-10 02:01:49
【问题描述】:
我正在尝试编写一个函数,其返回类型取决于其输入之一的值。
在 Idris 中,这很简单:
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 中以简单的方式做类似的事情吗?
我想我可以使用singletons 之类的东西,但我不知道如何正确使用它们。
这行得通:
{-# 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'
但这需要我使用SBools 而不是普通的Bools。我宁愿把它用作fun True。
有没有办法在 Haskell 中制作相当于 fun : (x : Bool) -> IntOrChar x 的方法?
【问题讨论】:
-
单例是我们的做法,因为 Haskell 实际上没有依赖类型。
-
Haskell 只有 GADT,它没有依赖类型强大(有时更方便,有时更麻烦或不够)。 Hasochism 论文中对 GADT 与依赖类型进行了很好的技术比较。
标签: haskell idris dependent-type