gpt4 book ai didi

haskell - 可以对公共(public)数据类型强制执行约束吗?

转载 作者:行者123 更新时间:2023-12-02 06:34:17 24 4
gpt4 key购买 nike

我有以下代码:

-- A CharBox is a rectangular matrix of characters
data CharBox = CharBox [String]
deriving Show

-- Build a CharBox, ensuring the contents are rectangular
mkCharBox :: [String] -> CharBox
mkCharBox [] = CharBox []
mkCharBox xxs@(x:xs) = if (all (\s -> (length s) == length x) xs)
then CharBox xxs
else error "CharBox must be a rectangle."

[[Char]] 必须是矩形的(即所有子列表的长度必须相同),模块中的许多函数才能正常工作。在模块内部,我总是使用 mkCharBox“构造函数”,因此我不必一直强制执行此约束。

最初我希望我的模块声明看起来像这样:

module CharBox (
CharBox, -- No (CharBox) because it doesn't enforce rectangularity
mkCharBox
) where

但是像那样,我的模块的用户无法在 CharBox 上进行模式匹配。在我做的另一个模块中

findWiresRight :: CharBox -> [Int]
findWiresRight (CharBox xs) = elemIndices '-' (map last xs)

而 ghci 提示:不在范围内:数据构造函数 'CharBox'

是否有可能强制执行我的约束,即 CharBoxes 仅包含矩形数组,同时仍然允许模式匹配?(如果这不可能,我会有兴趣知道原因的技术原因。我发现在探索此类限制时通常有很多东西要学习 Haskell)

最佳答案

在 vanilla Haskell 中不可能既隐藏构造函数又支持模式匹配。

解决这个问题的常用方法是:

或:

关于haskell - 可以对公共(public)数据类型强制执行约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23893351/

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