小编rub*_*oor的帖子

Haskell和Idris之间的区别:类型Universe中运行时/编译时的反映

所以在Idris中写下面的内容是完全有效的.

item : (b : Bool) -> if b then Nat else List Nat
item True  = 42
item False = [1,2,3] // cf. https://www.youtube.com/watch?v=AWeT_G04a0A
Run Code Online (Sandbox Code Playgroud)

没有类型签名,这看起来像一个动态类型的语言.但实际上,伊德里斯是依赖性的.具体类型item b只能在运行期间确定.

当然,这是一个Haskell程序员所说的:item bIdris意义上的类型是在编译时给出的,它是if b then Nat ....

现在我的问题:我是否正确地得出结论,在Haskell中,运行时和编译时之间的边界恰好在值的世界(False,"foo",3)和类型的世界(Bool,String,Integer)之间运行,而在Idris中,运行时和编译时之间的边界跨越了宇宙?

另外,我是否正确地假设即使在Haskell中使用依赖类型(使用DataKinds和TypeFamilies,参见本文),上面的例子在Haskell中是不可能的,因为与Idris相反的Haskell不允许值泄漏到类型级别?

haskell dependent-type type-level-computation idris

29
推荐指数
2
解决办法
4043
查看次数

为什么只有Applicative需要`pure`而没有Functor?

阅读这篇关于Haskell和类别理论基础知识的Wikibook,我学习了Functors:

仿函数本质上是类别之间的转换,因此给定类别C和D,仿函数F:C - > D.

将C中的任何对象A映射到D中的F(A).

映射态射f:A - > B在C到F(f):F(A) - > F(B)在D.

......听起来很不错.后来提供了一个例子:

我们也有一个示例实例:

instance Functor Maybe where
  fmap f (Just x) = Just (f x)
  fmap _ Nothing  = Nothing
Run Code Online (Sandbox Code Playgroud)

这是关键部分:类型构造函数可能将任何类型T转换为新类型,也许T.此外,fmap仅限于Maybe类型需要函数a - > b函数可能a - >可能b.但就是这样!我们已经定义了两个部分,一部分将Hask中的对象转换为另一个类别中的对象(Maybe类型和函数在Maybe类型上定义),以及将Hask中的态射视为此类别中的态射的东西.所以也许是一个算子.

我理解定义fmap是关键的.我很困惑"类型构造函数Maybe"如何提供第一部分.我宁愿期待类似的东西pure.

如果我做对了,Maybe而不是映射CD.(因此是类别级别的态射,这可能是Functor的要求)

我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure

haskell functor category-theory

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

如何使用镜头在地图中查找值,增加或将其设置为默认值

在处理一个名为AppStateI want 的状态时,需要跟踪实例的数量.这些实例具有不同类型的ID InstanceId.

因此,我的州看起来像这样

import           Control.Lens

data AppState = AppState
  { -- ...
  , _instanceCounter :: Map InstanceId Integer
  }

makeLenses ''AppState
Run Code Online (Sandbox Code Playgroud)

当没有计算具有给定id的实例时,跟踪计数的函数应该产生1,n + 1否则:

import Data.Map as Map
import Data.Map (Map)

countInstances :: InstanceId -> State AppState Integer
countInstances instanceId = do
    instanceCounter %= incOrSetToOne
    fromMaybe (error "This cannot logically happen.")
              <$> use (instanceCounter . at instanceId)
  where
    incOrSetToOne :: Map InstanceId Integer -> Map InstanceId Integer
    incOrSetToOne m = case Map.lookup instanceId …
Run Code Online (Sandbox Code Playgroud)

haskell state-monad lenses

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

在Haskell中,是否有<?> - 运算符的抽象?

我刚刚发现自己写了这段代码:

import Control.Applicative ((<|>))

x = mA <|> mB <?> c

(<?>) :: Maybe a -> a -> a
Just x  <?> _ = x
Nothing <?> y = y
Run Code Online (Sandbox Code Playgroud)

在哪里mA :: Maybe a,mB :: Maybe ac :: a,和x :: a.基本上,代码说:选择第一个不是empty默认的替代方案c.你可以把它称为"逆向也许monad",其中的类比<?>将是pure.

同样,我本来可以写的

Just x = mA <|> mB <|> pure c,
Run Code Online (Sandbox Code Playgroud)

但我对无可辩驳的模式感到不舒服.或者,当然,

x = fromMaybe c (mA <|> mB)
Run Code Online (Sandbox Code Playgroud)

因为fromMaybe === flip <?> …

haskell applicative maybe

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

如何显示“向下滚动!” 当且仅当内容在纯 CSS 中溢出?

我能找到的最接近的(对于纯CSS)是这样的:

https://lea.verou.me/2012/04/background-attachment-local/

...这可能不再是最新的。我怀疑这在 CSS 中是否可行。这是 Lea Verou 的代码:

/**
 * Scrolling shadows by @kizmarh and @leaverou
 * Only works in browsers supporting background-attachment: local; & CSS gradients
 * Degrades gracefully
 */

html {
    background: white;
    font: 120% sans-serif;
}

.scrollbox {
    overflow: auto;
    width: 200px;
    max-height: 200px;
    margin: 50px auto;

    background:
        /* Shadow covers */
        linear-gradient(white 30%, rgba(255,255,255,0)),
        linear-gradient(rgba(255,255,255,0), white 70%) 0 100%,
        
        /* Shadows */
        radial-gradient(50% 0, farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)),
        radial-gradient(50% 100%,farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%;
    background:
        /* Shadow …
Run Code Online (Sandbox Code Playgroud)

css scroll background

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

如何使用Persistent获取数据库实体的id?

我有一个数据库模型,使用像这样的Persistent

import           Database.Persist.TH (mkPersist, persistUpperCase,
                                  share, sqlSettings)

share [mkPersist sqlSettings] [persistUpperCase|
Foo
    field1 Int
    field2 Bool
|]
Run Code Online (Sandbox Code Playgroud)

我可以foo :: Foo从数据库中获取一个对象.我可以用fooField1 foo :: Int和访问字段fooField2 foo :: Bool.因为我使用sqlSettings,我知道存在Int64与每个实体存储的"id"的数据库密钥的代表.比如我用的时候get . toSqlKey :: Int64 -> ...

鉴于我foo :: Foo,我怎么得到id :: Int64

sql haskell persistent

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

在Windows上与Docker联网

我使用这个官方指南在Windows 7机器上设置Docker:

https://docs.docker.com/windows/started/

我成功从docker hub中提取了一个图像,我可以运行自己的docker镜像.

不,我试图在Windows上运行并使用docker访问网络服务器.显然,boot2docker我不能像我习惯的那样到达我的码头集装箱.

一旦我添加-p 3007:80docker run命令,端口转发显示在容器列表(docker ps)中0.0.0.0:3007 -> 80.与-p 127.0.0.1:3007:80我得到一个更有意义的IP地址.但是,我无法使用Windows主机上的浏览器访问容器.

此外, docker inspect不会显示正在运行的容器的IP地址(这似乎也是错误的).

我也试着--net=host无济于事.

windows networking docker

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

Monadic里面的符号让,有可能吗?

请考虑以下有效的Haskell代码

module Main where

main :: IO ()
main = do
  let x = f
  print x

f :: Maybe (Int, Int)
f =
  Just 3 >>= (\a ->
    Just 5 >>= (\b ->
      return (a, b)))
Run Code Online (Sandbox Code Playgroud)

其中函数f可以用这样的do-notation等效地重写

f :: Maybe (Int, Int)
f = do
  a <- Just 3
  b <- Just 5
  return (a, b)
Run Code Online (Sandbox Code Playgroud)

什么让我烦恼的是,当我把f内联的内容放进去的时候,这个符号是行不通的.以下代码甚至不解析:

main :: IO ()
main = do
  let x = do
    a <- Just 3
    b <- Just …
Run Code Online (Sandbox Code Playgroud)

haskell let do-notation

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

使用Haskell的镜头库来镜像镜头

在下面的代码中,我的问题涉及最顶层的功能someFunc(以下所有内容仅仅是为了提供一个完整的示例).我在那里使用了一个记录语法getter fmap.透镜的实施方式是someFunc什么?

import           Control.Lens
import           Data.IntMap  (IntMap)

someFunc :: Farm -> IntMap Size
someFunc farm =
  _barnSize <$> farm ^. farmBarns

data Farm = Farm
  { _farmBarns :: IntMap Barn
  }

farmBarns :: Lens' Farm (IntMap Barn)
farmBarns = lens _farmBarns (\farm barns -> farm { _farmBarns = barns } )

type Size = (Int, Int)

data Barn = Barn
  { _barnSize :: Size
  }

barnSize :: Lens' Barn Size
barnSize = lens _barnSize (\barn …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-lens

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

在 Haskell 中有效地读取和排序包含文本行的文件

我碰巧按自然频率对德语单词列表进行了排序1。我对我的算法的内存性能不满意。

在此输入图像描述

该图形是使用hp/D3.js创建的。它显示了 V1、V2 和 V3 的运行时堆,如下面的代码所示。

我在 github 上上传了完整的代码,包括如何运行分析(通过 stack 和 nix)的简短说明。下面也完整粘贴了。

版本 1 使用严格的 IO 读取两个大文件Data.Text.IO。可以很好地看出使用 Lazy IO 的版本 2 和版本 3 之间的差异Data.Text.Lazy.IO:某些东西立即跳入存在,而版本 2 和版本 3 则建立起来。

数据结构的大小

我可以根据这些公式给出相当准确的大小,并且我知道文件中的内容,平均德语单词的长度约为 16 个字符。这些数字不是根据输出解释的,而是独立计算的。

  • 地图频率:550 MB ( HashMap Text Int)
  • LS: 200 MB ( [Text])
  • 向量:167 MB ( Vector Text)

我不明白什么

除此之外我完全迷失了。我试图理解这些问题:

  1. 为什么我的被{-# SCC foo #-}忽略了?我无法控制分析中的成本中心。这种情况在 GHC 8.8.4 和 GHC 9.2.1、nix/cabal 和 stack 上都会发生。

  2. 该配置文件表明峰值内存使用量略高于 1 …

io performance profiling haskell

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