我最好写这样的东西:
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
致电myFunc myValue2回报True- 不是我想要的.我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?
这纯粹是一个理论问题,我知道如果有人声明私有方法,你可能不应该调用它.我设法调用私有虚方法并更改实例的私有成员,但我无法弄清楚如何调用私有非虚方法(不使用__asm).有没有办法获得指向该方法的指针?有没有其他方法可以做到这一点?
编辑:我不想改变类定义!我只想要一个黑客/解决方法.:)
假设我有以下字段的文档:
{field1, field2, ... fieldn}
我需要运行一些查询,其中一些条件需要在两个或多个字段之间进行比较.喜欢fieldX = fieldY
在标准SQL中,示例可以是:
SELECT * FROM Table1 WHERE farePrice>100 AND originRegion = destinationRegion
Run Code Online (Sandbox Code Playgroud)
我一直在阅读一些文档,看起来"脚本"可能是实现这一目标的唯一方法吗?或者还有其他选择吗?
使用Shake Haskell构建库,如何使用需要达到固定点的程序编写规则?想象一下,我有一个程序foo,它接受一个文件input并生成一个输出文件,应该foo重复应用,直到输出文件没有改变.我怎么能在Shake中写出来?
这种模式的典型例子是LaTeX.
我有一个程序使用haskell-src-exts,并提高性能我决定严格记录字段.这导致了更糟糕的表现.
这是我正在改变的完整模块:
{-# LANGUAGE DeriveDataTypeable, BangPatterns #-}
module Cortex.Hackage.HaskellSrcExts.Language.Haskell.Exts.SrcSpan(
SrcSpan, srcSpan, srcSpanFilename, srcSpanStartLine,
srcSpanStartColumn, srcSpanEndLine, srcSpanEndColumn,
) where
import Control.DeepSeq
import Data.Data
data SrcSpan = SrcSpanX
{ srcSpanFilename :: String
, srcSpanStartLine :: Int
, srcSpanStartColumn :: Int
, srcSpanEndLine :: Int
, srcSpanEndColumn :: Int
}
deriving (Eq,Ord,Show,Typeable,Data)
srcSpan :: String -> Int -> Int -> Int -> Int -> SrcSpan
srcSpan fn !sl !sc !el !ec = SrcSpanX fn sl sc el ec
instance NFData SrcSpan …Run Code Online (Sandbox Code Playgroud) 我正在开始Haskell ...我尝试用两种不同的方式编写以下简单的函数,让Haskell决定类型,类型系统在每种情况下都做了不同的事情.这种行为的解释是什么?
Prelude> let f x = 2 * x
Prelude> let g = (2*)
Prelude> :info f
f :: Num a => a -> a -- Defined at <interactive>:1:5
Prelude> :info g
g :: Integer -> Integer -- Defined at <interactive>:1:5
Run Code Online (Sandbox Code Playgroud)
谢谢!
在阅读Bartosz 为程序员提供的优秀类别理论时,我陷入了第二个练习,即第二个练习,它处理了网络中的产品.鉴于一个poset,
b e
? ? ?
a ? c f ? h
? ? ?
d g
Run Code Online (Sandbox Code Playgroud)
如何在分类意义上定义产品?什么是两个对象的产品分类?那副产品呢?
我试图从基于变换器的monad堆栈重写一个简单的解释器到基于更自由的效果,但是我正在努力将我的意图传达给GHC的类型系统.
我目前只使用State和Fresh效果.我正在使用两种状态,我的效果运动员看起来像这样:
runErlish g ls = run . runGlobal g . runGensym 0 . runLexicals ls
where runGlobal = flip runState
runGensym = flip runFresh'
runLexicals = flip runState
Run Code Online (Sandbox Code Playgroud)
最重要的是,我已经使用以下类型定义了一个函数FindMacro:
findMacro :: Members [State (Global v w), State [Scope v w]] r
=> Arr r Text (Maybe (Macro (Term v w) v w))
Run Code Online (Sandbox Code Playgroud)
到目前为止所有这一切都完美无缺.当我尝试编写时出现问题macroexpand2(好吧,macroexpand1,但我正在简化它,所以问题更容易理解):
macroexpand2 s =
do m <- findMacro s
return $ case m of
Just j -> True
Nothing -> False …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
{-# LANGUAGE TypeFamilies, TypeOperators, DataKinds, PolyKinds, FlexibleContexts, UndecidableInstances #-}
module Foo where
import Data.Singletons.Prelude
import Data.Type.Equality
data TP a b
-- foldl (\(bool, r) x -> (bool && (r == x), r)) (True, head xs) xs
type family Same (b :: Bool) (r :: k) (rq :: [k]) :: k where
Same bool r (x ': xs) = Same (bool :&& (r == x)) r xs
Same bool r '[] = TP bool r
data NotEqualFailure
-- converts a …Run Code Online (Sandbox Code Playgroud) 我设法构建了以下显示我的问题的"最小"示例.
如果启用了PatternSynonyms扩展
data Vec = Vec Int Int
pattern Ve x y = Vec x y
f :: (Vec, Vec) -> Vec
f (v@(Ve a b), Ve c d)
| a > b = Vec c d
| otherwise = v
Run Code Online (Sandbox Code Playgroud)
我得到了f函数的警告
Warning: Pattern match(es) are non-exhaustive
In an equation for `f': Patterns not matched: (_, _)
Run Code Online (Sandbox Code Playgroud)
如果我Ve用Vec它替换每一个都不会抱怨.我的奇异模式同义词如何干扰这里?