gpt4 book ai didi

haskell - 创建一个可以按任意顺序包含一个 int 和一个字符串的类型

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

我正在关注这个 introduction to Haskell ,以及这个特定的地方(用户定义的类型 2.2),我发现特别晦涩。到此为止,我什至不明白其中哪一部分是代码,哪一部分是作者的想法。 (什么是 Pt - 它从未在任何地方定义过?)。不用说,我无法执行/编译它。

作为一个让我更容易理解的例子,我想定义一个类型,它是一对整数和一个字符串,或者一个字符串和一个整数,但没有别的。

使用它的理论函数如下所示:

combine :: StringIntPair -> String
combine a b = (show a) ++ b
combine a b = a ++ (show b)

如果你需要一个工作代码,这样做也是一样的,这里是执行它的 CL 代码:
(defgeneric combine (a b)
(:documentation "Combines strings and integers"))

(defmethod combine ((a string) (b integer))
(concatenate 'string a (write-to-string b)))

(defmethod combine ((a integer) (b string))
(concatenate 'string (write-to-string a) b))

(combine 100 "500")

最佳答案

这是定义数据类型的一种方法:

data StringIntPair = StringInt String Int | 
IntString Int String
deriving (Show, Eq, Ord)

请注意,我定义了两个 构造函数类型 StringIntPair , 他们是 StringIntIntString .

现在在 combine的定义中:
combine :: StringIntPair -> String
combine (StringInt s i) = s ++ (show i)
combine (IntString i s) = (show i) ++ s

我正在使用 模式匹配匹配构造函数并选择正确的行为。

以下是一些使用示例:
*Main> let y = StringInt "abc" 123
*Main> let z = IntString 789 "a string"
*Main> combine y
"abc123"
*Main> combine z
"789a string"
*Main> :t y
y :: StringIntPair
*Main> :t z
z :: StringIntPair

关于示例的一些注意事项:
  • StringIntPair类型 ;做 :t <expression>在解释器中显示表达式的类型
  • StringIntIntString构造函数同类型
  • 竖线 ( | ) 分隔构造函数
  • 一个编写良好的函数应该匹配其参数类型的每个构造函数;这就是为什么我写了 combine有两种模式,一种用于每个构造函数
  • 关于haskell - 创建一个可以按任意顺序包含一个 int 和一个字符串的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9435526/

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