【问题标题】:New type declaring functions?新的类型声明函数?
【发布时间】:2016-10-04 09:16:16
【问题描述】:

我熟悉 newtype 声明:

newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord)

在这种情况下,Age 是一个 Int,但是我遇到了下面的代码,但我无法理解:

newtype Ages a = Ages {age :: String -> [(a,String)]}

这似乎是一个函数声明? (接受字符串,返回包含 'a' 和字符串的元组列表)- 这是正确的吗?

注意,我刚刚意识到这只是声明函数的基本记录语法。

另外,我已经尝试实现这种类型,但我一定做错了什么:

newtype Example a = Example {ex :: Int -> Int}

myexample = Example {ex = (\x -> x + 1)}

这可以编译,但是我不明白为什么我没有传递 'a' 参数?

【问题讨论】:

  • 不要向现有帖子添加新问题。也就是说,Example a 是使用 phantom type 的一个示例。

标签: haskell types


【解决方案1】:

这似乎是一个函数声明?

是的。具体来说,String -> [(a,String)] 是一个函数类型。 newtype 声明类似于任何给定类型的简单包装器。没有限制说你不能基于函数类型来制作它,它的工作方式完全相同。

还请记住,您可以始终newtype 替换为 data;在这种情况下,将结果类型视为具有函数字段的记录类型可能会有所帮助; newtype 只是一个特殊的优化案例。


另外一件事是你的两条线也不同,第二条线参数化了a。这当然可以与常规类型一起使用:

newtype MyWrapper a = MyWrapper a

或者一个函数类型可以是newtype-d 没有参数化

newtype MyFunction = MyFunction (Float -> Float)

您也可以使用记录语法编写上述内容,该语法也为您提供“getter”功能。

【讨论】:

  • 我怎样才能把这个newtype声明改成普通的函数声明?
  • @barbrac 你的意思是函数声明还是常规类型别名?如果是后者,只需使用type
  • @barbrac 这就是问题从一开始就应该是什么样子的。请避免进行大幅改变 Q/A 范围的编辑。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 2012-02-16
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多