- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在学习Arrow
按照教程 programming with arrows .我根据论文输入了以下代码,除了 SF
由 data
定义,而不是 newtype
和论文中一样(实际上,我做了这个更改是偶然的,因为我是从内存中输入代码的):
import Control.Category
import Control.Arrow
import Prelude hiding (id, (.))
data SF a b = SF { runSF :: [a] -> [b] } -- this is the change, using data instead of newtype as in the paper
-- The folowing code is the same as in the paper
instance Category SF where
id = SF $ \x -> x
(SF f) . (SF g) = SF $ \x -> f (g x)
instance Arrow SF where
arr f = SF $ map f
first (SF f) = SF $ unzip >>> first f >>> uncurry zip
instance ArrowChoice SF where
left (SF f) = SF $ \xs -> combine xs (f [y | Left y <- xs])
where
combine (Left _ : ys) (z:zs) = Left z : combine ys zs
combine (Right y : ys) zs = Right y : combine ys zs
combine [] _ = []
delay :: a -> SF a a
delay x = SF $ init . (x:)
mapA :: ArrowChoice a => a b c -> a [b] [c]
mapA f = arr listcase >>>
arr (const []) ||| (f *** mapA f >>> arr (uncurry (:)))
listcase :: [a] -> Either () (a, [a])
listcase [] = Left ()
listcase (x:xs) = Right (x, xs)
ghci
中加载文件时并执行
runSF (mapA (delay 0)) [[1,2,3],[4,5,6]]
,它会触发一个无限循环并最终耗尽内存。如果我改变
data
返回
newtype
, 一切都好。同样的问题发生在 ghc 8.0.2、8.2.2 和 8.6.3 中。
data
之间的区别和
newtype
,当定义只有一个字段的数据结构时,是运行时成本。但这个问题似乎暗示了它们之间的更多差异。或者我可能没有注意到
Arrow
的某些内容。类型类。
最佳答案
让我们看看这个例子。
data A = A [Int]
deriving (Show)
cons :: Int -> A -> A
cons x (A xs) = A (x:xs)
ones :: A
ones = cons 1 ones
ones
应该是
A [1,1,1,1...]
, 因为我们所做的只是将列表包装在
data
中构造函数。但我们会错的。回想一下,
data
的模式匹配是严格的。构造函数。也就是说,
cons 1 undefined = undefined
而不是
A (1 : undefined)
.因此,当我们尝试评估
ones
,
cons
模式匹配它的第二个参数,这导致我们评估
ones
... 我们出现了问题。
newtype
不要这样做。在运行时
newtype
构造函数是不可见的,所以就好像我们在普通列表上编写了等效程序
cons :: Int -> [Int] -> [Int]
cons x ys = x:ys
ones = cons 1 ones
ones
,有一个
:
我们与
ones
的下一个评估之间的构造函数.
newtype
通过使您的数据构造函数模式匹配惰性来实现语义:
cons x ~(A xs) = A (x:xs)
data
模式匹配默认是严格的;我看到的最引人注目的是,如果类型有多个构造函数,那么模式匹配将是不可能的。为了修复一些细微的 GC 泄漏,惰性模式匹配也有少量的运行时开销;评论中链接的详细信息。
关于haskell - 为什么 `data` 会导致无限循环,而 `newtype` 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55448666/
这个问题在这里已经有了答案: Casting vs using the 'as' keyword in the CLR (18 个答案) 关闭 2 年前。 这两个转换之间究竟有什么区别? SomeC
如何将 newtype 转换为 Int,反之亦然? 我尝试过: newtype NT1 = NT1 Integer fromNT1toInt :: NT1 -> Int fromNT1toInt x
真实世界的haskell 说: we will hide the details of our parser type using a newtype declaration 我不明白我们如何使用新类
我想定义一种“理想”类型,它是一个列表,但有一些结构。数字前奏已经定义了 Ring 的实例对于列表,但他们没有使用我想要的加法和乘法的定义。所以我认为在这种情况下我应该说 newtype Ideal
我正在用 SAT 做一些事情,我想要同时有“and”和“or”子句。 type AndClause = [Literal] type OrClause = [Literal] 但是我在使用它们时遇到
给定以下新类型: newtype Bar a = Bar { biz::Int -> Int -> Int } 是否可以对 Int -> Int 参数进行模式匹配? 例如,假设我想在 Bar 上对 m
我正在尝试理解 newtype 并认为这会起作用: module NT where newtype X = X Double newtype Y = Y Double doit :: X -> Y -
考虑以下代码示例,它创建了一个新类型来表示客户模型: module Main where import Effect (Effect) import Effect.Console ( logShow
假设我有这个新类型: newtype SomeType a = SomeType { foo :: OtherType a } 我要确保a是可显示的(属于类型类 Show x )。 我如何确保? (这
我有一个类型 class IntegerAsType a where value :: a -> Integer data T5 instance IntegerAsType T5 where v
Learn You a Haskell讨论 newtype . 它的签名如何Pair b a意味着传入的参数必须是一个元组? ghci> newtype Pair b a = Pair { getPa
我有兴趣为我的 monad 转换器堆栈获得缩放功能,该功能定义如下: newtype Awesome a = Awesome (StateT AwesomeState (ExceptT B.ByteS
我创建了一个 newtype为 Maybe Int : Prelude> newtype MaybeTuple = MaybeTuple { getMaybe :: Maybe Int} Prelud
这有什么区别: INPUT_FORMAT_TYPE = NewType('INPUT_FORMAT_TYPE', Tuple[str, str, str]) 和这个 INPUT_FORMAT_TYP
我有一个 UndecidableInstances我无法弄清楚如何避免使用 newtype 的问题.这是我最初的: {-# LANGUAGE TypeFamilies, FlexibleContext
我有一个 Haskell 项目,它使用了几个 newtypes . 我想导出这些表格,因此我可以将它包含在我的文档(非黑线鳕)中,例如作为 Markdown 表。我对此并不熟悉,但通过阅读,我的计划是
通常情况下,我正在编写剥离新类型的唯一构造函数的函数,例如在以下函数中返回不是 Nothing 的第一个参数: process (Pick xs) = (\(First x) -> x) . mcon
我最近在学习 PureScript,并做了一个在屏幕上绘制立方体的小应用程序。一切顺利,我在 Main 模块的顶部定义了一些 newtype,如下所示: newtype Vec2 = Vec2
Rewrite rules可以帮助您优化程序。我想知道如果我将对象包裹在 newtype 中它们是否会起作用.众所周知,newtype不会带来性能损失,它是一个在运行时消失的编译时包装器。所以我想知道
Difference between `data` and `newtype` in Haskell还有其他几个问题解决了数据和新类型之间的一般差异。我的问题是一个非常具体的问题。如果 G是某种类型,
我是一名优秀的程序员,十分优秀!