所以在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和类别理论基础知识的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而不是映射C到D.(因此是类别级别的态射,这可能是Functor的要求)
我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure?
在处理一个名为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) 我刚刚发现自己写了这段代码:
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 a和c :: 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 <?> …
我能找到的最接近的(对于纯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) 我有一个数据库模型,使用像这样的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?
我使用这个官方指南在Windows 7机器上设置Docker:
https://docs.docker.com/windows/started/
我成功从docker hub中提取了一个图像,我可以运行自己的docker镜像.
不,我试图在Windows上运行并使用docker访问网络服务器.显然,boot2docker我不能像我习惯的那样到达我的码头集装箱.
一旦我添加-p 3007:80到docker run命令,端口转发显示在容器列表(docker ps)中0.0.0.0:3007 -> 80.与-p 127.0.0.1:3007:80我得到一个更有意义的IP地址.但是,我无法使用Windows主机上的浏览器访问容器.
此外, docker inspect不会显示正在运行的容器的IP地址(这似乎也是错误的).
我也试着--net=host无济于事.
请考虑以下有效的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) 在下面的代码中,我的问题涉及最顶层的功能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) 我碰巧按自然频率对德语单词列表进行了排序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 个字符。这些数字不是根据输出解释的,而是独立计算的。
HashMap Text Int)[Text])Vector Text)除此之外我完全迷失了。我试图理解这些问题:
为什么我的被{-# SCC foo #-}忽略了?我无法控制分析中的成本中心。这种情况在 GHC 8.8.4 和 GHC 9.2.1、nix/cabal 和 stack 上都会发生。
该配置文件表明峰值内存使用量略高于 1 …
haskell ×8
applicative ×1
background ×1
css ×1
do-notation ×1
docker ×1
functor ×1
haskell-lens ×1
idris ×1
io ×1
lenses ×1
let ×1
maybe ×1
networking ×1
performance ×1
persistent ×1
profiling ×1
scroll ×1
sql ×1
state-monad ×1
windows ×1