我有以下(严重剥离)快乐的语法
%token
'{' { Langle }
'}' { Rangle }
'..' { DotDot }
'::' { ColonColon }
'@' { At }
mut { Mut }
ident { Ident }
%%
pattern
: binding_mode ident at_pat { error "identifier pattern" }
| expr_path { error "constant expression" }
| expr_path '{' '..' '}' { error "struct pattern" }
binding_mode
: mut { }
| { }
at_pat
: '@' pat { }
| { }
expr_path
: expr_path '::' ident …
Run Code Online (Sandbox Code Playgroud) 让我们假设这两种总和类型
data Currency =
| GBP
| EUR
| DKK
data Country =
| DE
| AT
| DK
| UK
Run Code Online (Sandbox Code Playgroud)
和以下产品类型
type CC = (Country, Currency)
Run Code Online (Sandbox Code Playgroud)
现在即使所有这些国家都是欧盟的一部分(是的,亲爱的软件考古学家从3000年开始 - 英国曾经是欧盟的一部分;-))他们有不同的货币(或不是).所以我想限制的可能值CC
,以
(DE, EUR)
(AT, EUR)
(UK, GBP)
(DK, DKK)
Run Code Online (Sandbox Code Playgroud)
并使其他所有组合都不可表达.
是否有可能在类型级别上表达这样的东西?
如果不是,那么精通Haskeller的方法怎么会这样呢?
有没有一种干净的方法来避免以下样板:
给定一个记录数据类型定义...。
data Value = A{ name::String } | B{ name::String } | C{}
Run Code Online (Sandbox Code Playgroud)
编写安全返回的函数 name
getName :: Value -> Maybe String
getName A{ name=x } = Just x
getName B{ name=x } = Just x
getName C{} = Nothing
Run Code Online (Sandbox Code Playgroud)
我知道您可以使用Template Haskell做到这一点,我正在寻找一种比这更清洁的解决方案,也许是GHC扩展或其他我忽略的东西。
以下Haskell代码:
main = putStrLn $ "bla " ++ (toStr (A 1) (A 2))
--main2 = putStrLn $ "bla " ++ (toStr (A 1) (A "String")) -- does not compile, as it should
main3 = putStrLn $ "bla " ++ (toStr (A "String") (A "String"))
data A a = A a deriving Show -- (1) data type declaration
class C a where -- (2) type class declaration
toStr :: a-> a->String
instance C (A a) where -- (3) instance declaration
toStr …
Run Code Online (Sandbox Code Playgroud) 我有一个功能:
sum f l1 l2 = (f l1) + (f l2)
Run Code Online (Sandbox Code Playgroud)
使用不同类型的列表调用时如何更正此功能?例如:
sum length [1,2] ['a','b']
如果有人有一个好名字,我不知道怎么说这个,请告诉我.
我正在尝试编写一个名为的类类Matchable
.这个想法是我有几种不同类型的正则表达式(RegExp a
,ComplexRegex a
)应该能够在输入上匹配.
所以我尝试了这个:
class Matchable a where
-- regex, input, success
match :: a -> b -> Bool
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是用类型构造函数或其他东西来解构类型类中的构造函数:
class Matchable a where
-- regex, input, success
match :: (B a) -> [a] -> Bool
Run Code Online (Sandbox Code Playgroud)
这样我就能得到一个RegExp Char
和ComplexRegex Char
两个匹配String
.有没有办法做到这一点?谢谢.
写这样的东西很好:
data Either a b = Left a | Right b
instance Functor (Either a) where
fmap _ (Left x) = Left x
fmap f (Right x) = Right (f x)
Run Code Online (Sandbox Code Playgroud)
现在让我说我要反转这个,左边将f应用于值:
instance Functor (Either a) where
fmap _ (Right x) = Right x
fmap f (Left x) = Left (f x)
Run Code Online (Sandbox Code Playgroud)
这不编译,我想我需要有类似的东西Functor (Either _ b)
,我该怎么做?
有一些签名功能:
a -> IO (m b)
b -> IO (m c)
c -> IO (m d)
Run Code Online (Sandbox Code Playgroud)
我如何将它们链接起来
a -> IO (m d)
Run Code Online (Sandbox Code Playgroud)
?
实际应用:说有一组REST端点.返回值和下一个值都需要将previous返回的值作为参数.
因此从端点获取的函数如下:
Value1 -> IO (Maybe Value2)
Value2 -> IO (Maybe Value3)
Value3 -> IO (Maybe Value4)
Run Code Online (Sandbox Code Playgroud) 我知道如何使用do
块内每个monad的函数.但是一旦我完成了如何运行计算并获得结果?
run :: (MonadError Error m, MonadState State m) => m Int -> Int
run = ???
Run Code Online (Sandbox Code Playgroud) 如果我有一个可变向量(IOVector a
例如类型),是否有类似地图的函数可以修改元素到位?
该vector
包提供了该modify
功能,但这一次只有一个元素.我应该使用它还是有首选方法?
并且为了澄清,矢量的类型将在之前和之后相同.
是的我先做了功课.我仍然被困住了.首先,请允许我对Microsoft弃用Installer项目类型表示不满.他们真丢人.
回到我的问题,这是错误:
Error 3 -3204: Cannot extract icon with index 0 from file <some_path>\obj\Debug\MyProject.Gui.exe.
Run Code Online (Sandbox Code Playgroud)
尝试#1:InstallShield:无法提取索引为0 vb.net的图标
- 答案说在我的exe中包含一个type类型的对象并重建.为此,我尝试了以下方法:
右键单击我的Windows窗体项目,添加新项目,图标,保存所有
在步骤1中打开图标文件,在其中绘制一些文本,保存所有文本
右键单击项目并选择rebuild(没有错误,看起来不错)
左键单击"指定应用程序数据" - >"文件",在项目中选择*.ico(注意:我可以清楚地看到它,并在对话框中显示为index0)
左键单击"常规信息" - >"显示图标" - >浏览*.ico(位于MyProject.Gui.exe的项目文件夹中)
保存所有并重建所有
...我仍然收到相同的错误消息.
如何"重新编译您的EXE以包含图标并且消息将消失"?
我正在尝试编写一个函数来打印列表中任何类型的所有元素(包括我自己的数据类型),但我发现并非所有类型都是show的实例.无论如何可以让haskell知道类型a是/不是show的实例?或者我可以简单地将每种类型转换为字符串.这是我的代码.
displayList :: [a] -> IO()
displayList (x : xs)
| not (null xs) = (show x) ++ displayList xs
| otherwise = show x ++ show xs
Run Code Online (Sandbox Code Playgroud)