我刚开始用MySQL/MariaDB学习SQL,我认为一个好的项目是为我(实际)当地的比萨饼店建立一个营养和价格信息数据库.我的整体概念:
一个表格提供有关成分营养信息的信息.
一张成分价格信息表.
一份食谱表,显示每个披萨中每种成分的含量.
我有几个问题:
营养信息的不同成分和方面通常使用不同的单位:每杯盐的毫克钠,每液体盎司酱的毫克钠,每磅面粉的蛋白质克数,每磅面粉的卡路里等.我该如何处理?从理论上讲,最干净的方法是测量除了卡路里以毫克为单位的所有营养素,以及所有成分(千克),但后来我需要一张密度表(并不总是随时可用)以及一些方法来隔离用户那个烂摊子.并且卡路里仍然是偏执的.
披萨,面团和酱汁的两个关键方面,作为(几乎)各种比萨饼的"子食谱".处理这个问题的正确方法是什么?
我正在研究一个有文化的Haskell脚本,该脚本定义了一个Grammar数据类型,该数据类型将加载到我的Mac上的GHCI(v.7.8.3)中.我试图在我的脚本中打开名为KindSignatures和GADT的语言扩展(我完全不熟悉这些)但我被建议包括该行
{-# LANGUAGE KindSignatures, GADTs #-}
Run Code Online (Sandbox Code Playgroud)
在我的脚本的顶部.但是我收到一条错误消息:
Grammars.lhs:5:3:
Illegal kind signature ‘Grammar’
(Use KindSignatures to allow kind signatures)
In the data declaration for ‘Grammar’
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我我做错了什么吗?还有关于KindSignatures或GADT的任何文档吗?我一直找不到多少.
很容易表示自由岩浆(二元叶子树),自由半群(非空列表)和自由幺半群(列表),并且不难证明它们实际上是他们声称的那样.但自由团体似乎更棘手.似乎至少有两种使用常规List (Either a)表示的方法:
Left a :: Right b :: ...那么Not (a = b)相反.构建这些似乎有点困难.Left a :: Right a :: ...对(以及相反的方式).表达这种关系似乎非常复杂.其他人有更好的主意吗?
我刚刚意识到唯一的答案所使用的选项(1)根本无法在最常规的设置中工作.特别是,如果不实施可判定的平等,就无法定义组操作!
我应该首先想到Google.看起来Joachim Breitner 几年前在Agda做过,从他的介绍性描述来看,看起来他从选项1开始,但最终选择了选项2.我想我会自己尝试,如果我太卡住了我会看看他的代码.
运营商
$
. or <<<
<$>
<*>
=<<
<=<
Run Code Online (Sandbox Code Playgroud)
一起走得很好,每个人在某种意义上将左边的东西应用到右边的东西上.在考虑另一种方式时,我们有
&
>>>
>>=
>=>
Run Code Online (Sandbox Code Playgroud)
但有翻转的版本<$>和<*>?
我刚开始学习一个Haskell,我在一个例子中看到了这个没有解释:
tell :: (Show a) => [a] -> String
Run Code Online (Sandbox Code Playgroud)
这是什么意思,特别是=>?我知道如果我替换->或删除它将无法工作,但我真的不明白为什么.
Edward Kmett的实验角色包提供了各种用于解除强制的工具,其中一些是我在这个问题的最后粘贴的.包中的关键类是
class Representational (t :: k1 -> k2) where
-- | An argument is representational if you can lift a coercion of the argument into one of the whole
rep :: Coercion a b -> Coercion (t a) (t b)
Run Code Online (Sandbox Code Playgroud)
鉴于类型
newtype Fix p a = In {out :: p (Fix p a) a}
Run Code Online (Sandbox Code Playgroud)
我希望能写出类似的东西
instance Representational p => Representational (Fix p)
Run Code Online (Sandbox Code Playgroud)
我相信以下内容应该有效,除了一件丢失的内容.我也有点担心,bar可能会严格到将一切都扔进一个无限循环.
-- With {-# LANGUAGE PolyKinds, ScopedTypeVariables, etc.)
import Data.Type.Coercion
import Data.Coerce
import …Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用 Gloss 库在 Haskell 中制作一些动画。
考虑下面的代码,它对一个圆进行动画处理,使其半径随着时间的推移而缩小和扩大。
import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
type Radius = Float
type RealTime = Float
data World = World Radius RealTime
main :: IO ()
main
= do let initWorld = World 100.0 0
let windowSize = (800,800)
let windowPosition = (200,200)
putStrLn "Before play"
play (InWindow "Wobbling Circle" windowSize windowPosition)
white 40 initWorld renderWorld handleEvent stepWorld
putStrLn "After play"
renderWorld :: World -> Picture
renderWorld (World rad rtime ) = Pictures [ Circle rad ]
handleEvent …Run Code Online (Sandbox Code Playgroud) 我一直在考虑是否有一些可以添加的方法,以便Traversable在昂贵的仿函数存在的情况下使其更便宜.灵感来自于Control.Lens.Traversal.confusing使用特殊Applicative功能来做类似的事情.
confusing :: Applicative f => LensLike (Curried (Yoneda f) (Yoneda f)) s t a b -> LensLike f s t a b
Run Code Online (Sandbox Code Playgroud)
不幸的是,confusing真正实现其名称 - 我不明白它实际上在做什么.特别是,我没有直觉Curried.
此外,confusing它具有CPS风味,这表明它可能对我的目的来说太严格了.Yoneda可以换掉Coyoneda来增强懒惰,但我不知道该怎么办Curried.
如何在elm-repl中找出Elm表达式或子表达式的类型?
Haskell :type或:t等同于Elm REPL?
我正在跟踪大约两年前录制的视频。演讲者输入Either a b -> IO b了公共Hoogle搜索输入,结果包含(其中包括):
either :: (a -> c) -> (b -> c) -> Either a b -> c
Run Code Online (Sandbox Code Playgroud)
如果我今天尝试一下,找不到此结果,这是一个遗憾。找到类似的结果,例如
fromEither :: (Exception e, MonadIO m) => Either e a -> m a
Run Code Online (Sandbox Code Playgroud)
但它们不易使用。
如何解释呢?Hoogle搜索算法变得更严格了吗?有没有改变?