gpt4 book ai didi

haskell - 重载函数名称的更简单语法

转载 作者:行者123 更新时间:2023-12-02 18:59:29 26 4
gpt4 key购买 nike

在具有类型族扩展的 Haskell 中,这是完全合法的( ideone ):

{-# LANGUAGE TypeFamilies #-}

type family F a

data A = A Int
data B = B Double

type instance F A = Int
type instance F B = Double

class Get a where
get :: a -> F a

instance Get A where
get (A x) = x

instance Get B where
get (B x) = x

main = print $ (get (A 3), get (B 2.0))

基本上我定义了两个函数get

带有类型签名的:

get :: A -> Int

第二个:

get :: B -> Double

但是,上面的代码有很多麻烦。我希望能够做到的是:

get :: A -> Int
get (A x) = x

get :: B -> Double
get (B x) = x

我知道使用这种语法完全行不通,但是有什么方法可以在不使用十几行定义类型实例和类实例的情况下获得我想要实现的目标吗?考虑到第一个代码工作正常,我认为 Haskell 编译器没有理由不能将这段较短的代码放入上面的代码中。

最佳答案

这应该可以完成工作:

class Get a b | a -> b where
get :: a -> b

instance Get A Int where
...

https://www.haskell.org/haskellwiki/Functional_dependencies

好吧,所以它只摆脱了类型族。我认为您无法摆脱类型类,因为它们是实现重载的方法。此外,如果没有类,您将无法在类型中表达类​​约束,例如你不能这样写:

getPaired :: (Get a b, Get c d) => (a, c) -> (b, d)

关于haskell - 重载函数名称的更简单语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com