- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
虽然这个例子是人为的,但如果忽略数据构造函数,为什么我不能使用通配符模式?
module Main where
import Prelude
import Control.Monad.Eff.Console (log)
data Person = Amy { name :: String } | George { name :: String }
--Implementations Options Below
main = log $ personToString $ George { name: "George" }
没有错误
personToString :: Person -> String
personToString (Amy { name: n }) = n
personToString (George { name: n }) = n
错误
personToString :: Person -> String
personToString (_ { name: n }) = n
http://try.purescript.org/?session=a1503b9a-0546-7832-39b0-6321a89ef2e3
Unable to parse module:
unexpected {
expecting ::, operator or )
最佳答案
我不确定为什么编译器无法推断出两个 sum 类型都有 { name::String }
作为参数。我认为编译器现在还不能做到这一点,而且我不确定这是否可能。
话虽如此,有一些方法可以内省(introspection)您使用的类型,并且您可以定义 personToString
函数,以便它可以在您的 Person
类型上工作。请记住,这是深入研究该语言的更高级领域,这对我来说也是一个新领域。这可能远远超出了您的问题,但可能对其他人有帮助,并且很高兴知道什么是可能的。
首先,让我们为“有名称的类型”定义一个类型类。
class DoesHaveName a where
getName :: a -> String
现在我们需要检查 Person
类型的结构。为此,我们可以使用 purescript-generics-rep包裹。首先,我们将告诉编译器检查数据类型并创建它的通用表示形式。我们将为 Person
类型创建一个 Generic
实例。
import Data.Generic.Rep (class Generic)
derive instance genericPerson :: Generic Person _
通过查看 Data.Generic.Rep 中的构造函数,我们可以看到表示类型的所有不同方式。 ,我们可以使用 from 将 Person
转换为该结构。 .
import Data.Generic.Rep (class Generic, from)
personToString :: Person -> String
personToString a = getName (from a)
现在我们必须为任何接受 { name::String }
的单参数构造函数创建一个 DoesHaveName
实例。
import Data.Generic.Rep (class Generic, to, from, Sum(..), Rec(..), NoConstructors, Constructor(..), Field(..))
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
instance doesHaveNameConstructor
:: (IsSymbol t0, IsSymbol t1)
=> DoesHaveName (Constructor t0 (Rec (Field t1 String))) where
getName (Constructor (Rec (Field c))) =
case (reflectSymbol (SProxy :: SProxy t1)) of
"name" -> c
_ -> "NoName"
有很多值得思考的地方。我会尽力将其分解。 t0
和 t1
是符号 - 因此它们是您编写的文字代码的一部分。在本例中,t0
是 Sum 类型构造函数的名称(Amy 或 George)。 t1
是记录的标签(在您的示例中它将是“name”)。因此,我们使用 reflectSymbol
将符号转换为我们可以匹配的字符串。如果标签是“name”,那么我们将返回字段内的值,否则我们将返回“NoName”。
我们需要做的最后一件事是为 Sum 类型结构创建一个 DoesHaveName
实例。 Sum 类型包含构造函数,因此该实例基本上只是处理外部结构并委托(delegate)给我们上面定义的实例。
instance doesHaveNameSum
:: (DoesHaveName a, DoesHaveName b)
=> DoesHaveName (Sum a b) where
getName (Inl a) = getName a
getName (Inr b) = getName b
现在我们可以记录各种人的名字...
data Person
= Amy { name :: String }
| George { name :: String }
| Jim { name :: String }
-- Logs "amy"
log $ personToString (Amy { name: "amy" }
-- Logs "george"
log $ personToString (George { name: "george" }
-- Logs "jim"
log $ personToString (Jim { name: "jim" }
演示:http://try.purescript.org/?gist=2fc95ad13963e96dd2a49b41f5703e21
关于haskell - Purescript:模式匹配通配符数据构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46270237/
来自 F# 世界,我习惯使用 |>将数据通过管道传输到函数中: [1..10] |> List.filter (fun n -> n % 2 = 0) |> List.map (fun n -> n
是否可以对 Purescript 中的类型构造函数施加某些限制?例如: newtype Name = Name String -- where length of String is > 5 最
我刚刚开始学习 Purescript,所以我希望这不是一个愚蠢的问题。 假设我们有一个对象 a = {x:1,y:2} 我们想要将 x 更改为等于 2。据我所知,如果我们使用 ST monad,我们将
我想知道如何在 PureScript 代码中添加注释。 在 Python 中,等价的是: # Here is a comment 或JavaScript // Another comment Pure
当在缩进位置使用三引号时,我肯定也会在输出 js 字符串中缩进: 在嵌套的 let 中比较这两个 let input1 = "T1\nX55.555Y-44.444\nX52.324Y-40.386"
PureScript by Example,在 The Eff Monad -> Handlers and Actions 部分指出“[效果]处理程序通常从集合中减去效果”。但是,这些示例相当不透明,
纯脚本列表中是否有 foreach 方法? foreach 方法获取列表的每一项并返回一个单位。 它是打印列表中每个项目的好方法。 编辑:我正在尝试下面建议的 traverse 方法,但出现错误 im
我首先是关于 Purescript 的。 我要将新字段添加到 Object 并将其作为函数参数发送。 但我找不到一个好的解决方案。 例如。 oldFiled = { title : "title",
我正在使用 Purescript 做第一步并复制 "hello world" app . 测试通过。我故意破坏了测试。 module Test.Main where import Prelude im
我是 Purescript 的新手,所以这可能是一个幼稚的问题。 我想编写一个 Purescript 函数,它从浏览器上的 HTML 输入元素读取输入,并将一些输出写入另一个 HTML 输入元素。 使
我想制作一个非常人性化的开发环境,我正在考虑使用 PureScript 来提供语言部分。我看到开箱即用,Show不适用于作为 Show 实例的事物的记录: log (show {a:5}) “试试 P
有没有办法做类似的事情 first = {x:0} second = {x:1,y:1} both = [first, second] 使得 both推断为 {x::Int | r}或类似的东西? 我
我正在使用 purescript-halogen,当捕获到子组件的消息时,我想滚动到 div 的底部。 但是,在 Halogen 中似乎不存在滚动 Action 控制。 那么,我该如何 Scroll
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
我有一个类型为 Either String (Either String Int) 的对象.我想将其折叠为 Either String Int 类型的对象. PureScript 中是否有为此提供的函
我想使用 Purescript 的 Halogen 编写前端的特定组件。 例如,我想使用卤素创建一个注册表单。它看起来像下面这样: module RegistrationForm where impo
这对我来说似乎是一个奇怪的问题,但我已经通过了 purescript-datetime和 purescript-js-date而我就是找不到获取当前信息的方法 DateTime .是否有一些隐藏的库函
当目标平台是 JavaScript 时,我正在寻找一种控制 Purescript 代码翻译格式的方法。 “spago bundle-app”为 ES5 版本生成 JavaScript 代码。 spag
我正在使用 purescript-halogen 构建类似电子表格的表格(类似于 Handsontable )。如果您双击一个单元格,一个 html 输入元素将呈现为相应表格单元格的子元素(并且不会为
我是一名优秀的程序员,十分优秀!