gpt4 book ai didi

haskell - 为 newtype 定义构造函数

转载 作者:行者123 更新时间:2023-12-04 23:29:26 25 4
gpt4 key购买 nike

我有一个类型

class IntegerAsType a where
value :: a -> Integer

data T5
instance IntegerAsType T5 where value _ = 5

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

我四处寻找一种方法来指定新类型的构造函数。我意识到只能有一个,但我不明白为什么我可以指定它是什么。

例如,我可能只想将参数的前三个元素带到 PolyRing值构造函数。

我尝试使用 where 添加newtype 声明末尾的子句,但没有编译。

我也试过:
(PolyRing xs) = PolyRing [2, 3, 5, 7]

作为一个玩具的例子。我认为这应该做的是忽略值构造函数的参数并始终具有值 [2,3,5,7] .代码编译,但我的“自定义”构造函数没有效果。

是否可以为新类型指定构造函数?

最佳答案

我认为您正在寻找的是 Smart constructor .
PolyRing的基本大写构造函数不能重载。但是你可以做的是:

polyRing :: (Num a, IntegerAsType n) => [a] -> PolyRing a n
polyRing = PolyRing . take 3

或者,甚至更好:
polyRing :: (Num a, IntegerAsType n) => [a] -> Maybe (PolyRing a n)
polyRing (a:b:c:_) = Just $ PolyRing [a, b, c]
polyRing _ = Nothing

为了防止有人使用 PolyRing直接构造函数,文件顶部的模块导出声明可能如下所示:
module PolyRing (
PolyRing (), -- Export the PolyRing type but not constructor
polyRing -- Your smart constructor
) where

在 OO 中,封装的单位是类,但在 Haskell 中,它是模块。

关于haskell - 为 newtype 定义构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289627/

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