小编tom*_*tom的帖子

为什么 Haskell 的括号函数在可执行文件中工作但在测试中无法清理?

我看到一个非常奇怪的行为,其中 Haskell 的bracket函数根据是否使用stack run或被stack test使用而表现不同。

考虑以下代码,其中两个嵌套的括号用于创建和清理 Docker 容器:

module Main where

import Control.Concurrent
import Control.Exception
import System.Process

main :: IO ()
main = do
  bracket (callProcess "docker" ["run", "-d", "--name", "container1", "registry:2"])
          (\() -> do
              putStrLn "Outer release"
              callProcess "docker" ["rm", "-f", "container1"]
              putStrLn "Done with outer release"
          )
          (\() -> do
             bracket (callProcess "docker" ["run", "-d", "--name", "container2", "registry:2"])
                     (\() -> do
                         putStrLn "Inner release"
                         callProcess "docker" ["rm", "-f", "container2"]
                         putStrLn "Done with …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-stack

11
推荐指数
1
解决办法
206
查看次数

在水化完成之前如何处理SSR文本框中的文本输入变化?

我正在研究一个简单的服务器端渲染(SSR)场景:只是一个登录页面,其中包含用户名和密码的文本输入。

与 SSR 一样,当客户端首次加载页面时,他们会获得服务器渲染的版本,该版本未经过水化。看起来不错,并且可以单击文本框并输入内容。

希望 JS 能够快速加载,并且在用户在框中输入任何内容之前就发生水合作用,并且一切正常。

但是,如果用户的网络速度很慢并且 JS 需要几秒钟才能加载怎么办?然后会发生以下情况:

  1. 用户在框中输入一些字符
  2. JS 突然加载,React 控制了输入框,并清除了它,因为初始状态是一个空字符串(!)
  3. 用户感到困惑,必须重新输入。

一定有一个最佳实践,对吗?我尝试过一些事情,例如测试 iftypeof window === "undefined"并将输入设置为disabledif so,但没有什么是令人满意的。我认为最好的用户体验是让水合组件拾取已键入的字符,但我也可以禁用编辑,直到水合完成。

FWIW 我正在使用 Material UI,它会带来一些额外的样式问题,但除此之外,我认为这个问题适用于任何 SSR 文本输入场景。

reactjs material-ui server-side-rendering

8
推荐指数
1
解决办法
885
查看次数

如何最小化部署 Next.js 非静态应用程序?

Next.JS 文档和其他教程描述如何部署非静态应用程序(即您运行的应用程序npm run start)的方式似乎在应用程序中留下了很多不必要的东西。他们说就跑npm run build,然后跑npm run start,恭喜你,你完成了!

这对我来说很奇怪,因为当其他系统(如 Webpack)创建可部署版本时,它要小得多。通过最小的我的意思是它不包含

  • devDependenciesnode_modules
  • 未压缩的源文件(我的是 TypeScript)
  • 其他杂项,如 React Storybook 故事等。

就我而言,这些额外的东西加起来可达数百兆字节。

我有一个看起来像这样的部分解决方案:

  1. npm run build
  2. 创建一个新的文件夹,复制node_modules.nextstaticpackage.json,和几个其他的东西进去
  3. cd到新文件夹并运行npm prune --production以删除开发依赖项

这基本上有效,但我并不完全满意。一方面,node_modules仍然包含很多不需要的东西。在 Webpack 产品中,由于树抖动,这些东西将被忽略。另一方面,我有几个其他特定于应用程序的文件夹,我必须记住要复制过来。

为什么这么难?有没有更好的方法来做到这一点?

npm next.js

6
推荐指数
1
解决办法
500
查看次数

在 CSS 缩放存在的情况下,如何使用 getBoundingClientRect() 获取屏幕坐标?

我试图在屏幕坐标中使用 Javascript 找到 HTML 元素的边界框,以便我可以使用外部工具(例如 的ffmpeg屏幕x11grab录制功能)来单独获取该元素的屏幕截图/视频。

如果没有 CSS 缩放,那么我可以找到元素的边界框,elem如下所示:

let viewportTop = window.screenY + (window.outerHeight - window.innerHeight);
let viewportLeft = window.screenX;

let rect = elem.getBoundingClientRect();
let width = rect.width;
let height = rect.height;
let left = viewportLeft + rect.left;
let top = viewportTop + rect.top;
Run Code Online (Sandbox Code Playgroud)

然后我可以使用这些width, height, left, top坐标在浏览器窗口上记录所需的框。

然而,有时我想增加元素的缩放以便更容易看到:

elem.style.zoom = "2";
Run Code Online (Sandbox Code Playgroud)

完成此操作后,返回的边界框elem.getBoundingClientRect()现在按比例缩小了2。如果我使用上面的方法来计算我的记录边界框,它不再与元素对齐。

window.getComputedStyle(elem, null).getPropertyValue("zoom")我在调用、解析缩放数字并使用它来纠正边界框方面​​取得了一些成功。然而,这不是一个完美的解决方案——如果我想缩放document.body一定量并且也缩放目标元素一定量怎么办?

所以,我想知道是否有一种通用方法可以将坐标转换为elem.getBoundingClientRect屏幕坐标,即使在 CSS 缩放应用于各种元素时也能正常工作。

  • 我考虑过使用浏览器自己的缩放而不是 CSS 缩放,但我不愿意,因为我使用 Selenium …

html javascript css selenium

6
推荐指数
0
解决办法
1272
查看次数

Haskell 代码中函数 (toEnum . fromEnum) 的用途是什么?

我看到了toEnum . fromEnumChars in上使用的函数HaskellNet.Network.Auth

b64Encode :: String -> String
b64Encode = map (toEnum.fromEnum) . B64.encode . map (toEnum.fromEnum)

b64Decode :: String -> String
b64Decode = map (toEnum.fromEnum) . B64.decode . map (toEnum.fromEnum)
Run Code Online (Sandbox Code Playgroud)

乍一看这个功能应该和 一样id吧?为什么会在这里?

haskell

6
推荐指数
1
解决办法
725
查看次数

如何在普遍量化的自由单子上进行模式匹配?

我想知道我是否可以写一个函数isPure :: Free f () -> Bool,它告诉你给定的自由 monad 是否相等Pure ()。对于一个简单的情况,这很容易做到,但对于更复杂的情况,我无法弄清楚 functor 有约束f

import Control.Monad.Free

-- * This one compiles

isPure :: Free Maybe () -> Bool
isPure (Pure ()) = True
isPure _ = False

-- * This one fails to compile with "Ambiguous type variable ‘context0’ arising from a pattern
-- prevents the constraint ‘(Functor context0)’ from being solved."

{-# LANGUAGE RankNTypes #-}
type ComplexFree = forall context. (Functor context) => Free context …
Run Code Online (Sandbox Code Playgroud)

haskell

6
推荐指数
2
解决办法
114
查看次数

如何区分具有不同幻像类型的 GADT 构造函数?

我正在开发一个系统(受lsp-types启发),该系统使用标记有类型信息的 GADT 来表示客户端和服务器交换的不同类型的消息:

{-# LANGUAGE GADTs, DataKinds, KindSignatures, RankNTypes #-}

data From = FromClient | FromServer
data MessageType = Request | Notification

data Message (from :: From) (typ :: MessageType) where
  Request1 :: Message FromClient Request
  Request2 :: Message FromClient Request
  Request3 :: Message FromServer Request
  Notification1 :: Message FromClient Notification
Run Code Online (Sandbox Code Playgroud)

我的问题是,给定这些构造函数的列表(在存在性包装器中),我如何选择具有特定类型的它们的子集?

data SomeMessage where
  SomeMessage :: forall f t. Message f t -> SomeMessage

allMessages = [SomeMessage Request1
              , SomeMessage Request2
              , SomeMessage Request3
              , SomeMessage Notification1] …
Run Code Online (Sandbox Code Playgroud)

haskell gadt

5
推荐指数
0
解决办法
149
查看次数

如何在没有额外分配的情况下将文本转换为向量

我有一个关于转换TextData.Vector.Unboxed.Vector. 我一直在使用这样的基准测试工具来玩它weigh,并且我看到了很多无关的分配:

{-# LANGUAGE BangPatterns #-}
module Main (main) where

import Control.Monad
import Data.String.Interpolate
import Data.Text as T
import qualified Data.Vector.Unboxed as VU
import Weigh

testFunc :: Int -> Text -> Weigh ()
testFunc inputSize text = wgroup [i|#{inputSize} characters|] $ do
  func' "VU_fromList" VU.fromList (T.unpack text)
  func' "VU_fromListN" (\t -> VU.fromListN (T.length t) (T.unpack t)) text

main :: IO ()
main = mainWith $
  forM_ [10, 100, 1000, 10000, 100000] $ \n -> …
Run Code Online (Sandbox Code Playgroud)

haskell

5
推荐指数
1
解决办法
135
查看次数

Cabal无法安装依赖项,但如果直接询问则可以安装它们

我看到一个非常奇怪的反复出现的问题,Cabal干扰了我获得可重复的Haskell构建的能力.我有一个带沙盒的cabal项目.如果我这样做cabal install,我会得到表格的错误

Y failed during the building phase. The exception was: ExitFailure 1 X depends on Y which failed to install.

其中X是我项目的直接依赖,Y是一些传递依赖.但是,如果我只是键入cabal install X,那么它的工作原理!

这是一个具体的例子:我的项目取决于interpolate包.当我这样做时cabal install --allow-newer,我得到这样的错误:

Resolving dependencies...
Configuring haskell-src-meta-0.6.0.9...
Building haskell-src-meta-0.6.0.9...
Preprocessing library haskell-src-meta-0.6.0.9...
[1 of 6] Compiling Language.Haskell.TH.Instances.Lift ( src/Language/Haskell/TH/Instances/Lift.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/TH/Instances/Lift.o )
[2 of 6] Compiling Language.Haskell.Meta.Syntax.Translate ( src/Language/Haskell/Meta/Syntax/Translate.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Syntax/Translate.o )
[3 of 6] Compiling Language.Haskell.Meta.Parse ( src/Language/Haskell/Meta/Parse.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse.o )
[4 of 6] Compiling Language.Haskell.Meta.Parse.Careful ( src/Language/Haskell/Meta/Parse/Careful.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse/Careful.o ) …
Run Code Online (Sandbox Code Playgroud)

haskell cabal cabal-install

2
推荐指数
1
解决办法
347
查看次数