我是Haskell的初学者.我有一个我在Haskell中使用的元组列表:结构是这样的[(a,b),(c,d),(e,f),(g,h)]
我想要的是根据第二个值返回此元组中的最大元素:因此,如果元组列表是[(4,8),(9,10),(15,16),(10,4)],我想要最大元素(15,16).
但我不知道该怎么做.这是我到目前为止的尝试,
maximum' :: (Ord a) => (Num a) => [(a,b)] -> a
maximum' [] = error "maximum of empty list"
maximum' [(x,y)] = -1
maximum' (x:xs)
| snd x > snd(xs !! maxTail) = 0
| otherwise = maxTail
where maxTail = maximum' xs + 1
Run Code Online (Sandbox Code Playgroud)
我得到这个错误信息对我来说没有意义:
newjo.hs:23:25:
Could not deduce (a ~ Int)
from the context (Ord a, Num a)
bound by the type signature for
maximum' :: (Ord a, Num a) …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用数据记录作为我正在编写的应用程序的数据库后端,因为我认为可以让我轻松地在表示之间切换,而不必牺牲我收集的数据或编写繁琐的迁移.
但是,我无法预见我将如何处理更改数据 - 例如,用户可更改密码这样简单的事情.我有一个想法用日期标记行:
changepassword(<user>, <passhash>, <date>)
Run Code Online (Sandbox Code Playgroud)
然后使用最新的,但似乎没有办法获得最新的,没有返回所有行并在应用程序端过滤它们.
数据记录应用程序如何设计来处理变化的数据?
我有一个非常复杂的对象网络,我想在不受信任的环境中序列化和反序列化(Web浏览器,使用Unity 3D).普通BinaryFormatter序列化工作正常,但反序列化因"访问私有字段"错误而崩溃.当我在本地运行时它非常有效.
我宁愿不通过公开所有私有字段来使我的代码库变得糟透了.如果没有这样做,反序列化在不受信任的环境中工作的最佳方法是什么?我愿意改变序列化方法,BinaryFormatter这是最容易上手的方法.
更新我不想阻止序列化访问我的私有数据,我想允许序列化访问我的私有数据而不必公开它,从而损害我的代码的封装.
谢谢.
我想解析这样的文件:
66:3 3:4 329:2 101:3 495:4 55:5 268:5 267:2 242:4 262:1 861:1
我的代码如下:
getTestData :: String -> IO [[(Int, Int)]]
getTestData name = do
--res <- parseFromFile testData (name ++ ".test")
fc <- readFile (name ++ ".test")
let res = parse testData "test data" fc
case res of
Left e -> error $ show e-- "test data parse eror."
Right ts -> return ts
eol = char '\n'
testData = endBy line eol
--testData = many line
testTuple = do …Run Code Online (Sandbox Code Playgroud) 粗略地说,我有
check : UExpr -> Maybe Expr
Run Code Online (Sandbox Code Playgroud)
我有一个测试术语
testTerm : UExpr
Run Code Online (Sandbox Code Playgroud)
我希望能check成功,之后我想提取结果Expr并进一步操纵它.基本上
realTerm : Expr
just realTerm = check testTerm
Run Code Online (Sandbox Code Playgroud)
如果check testTerm结果是这个定义将无法进行类型检查nothing.这可能吗?
我正在阅读Jeremy Gibbons关于折纸编程的文章,我坚持练习3.7,要求读者证明列表的融合法展开:
Run Code Online (Sandbox Code Playgroud)unfoldL p f g . h = unfoldL p' f' g'如果
Run Code Online (Sandbox Code Playgroud)p . h = p' f . h = f' g . h = h . g'
unfoldL列表展开的功能定义如下:
unfoldL :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> List a
unfoldL p f g b = if p b then Nil else Cons (f b) (unfoldL p f g (g b))
Run Code Online (Sandbox Code Playgroud)
这是我目前尝试的证据:
(unfoldL p f …Run Code Online (Sandbox Code Playgroud) 我正在编写一个编译器/校对检查器,我想知道,如果我有一个这样的语法树,例如:
data Expr
= Lambdas (Set String) Expr
| Var String
| ...
Run Code Online (Sandbox Code Playgroud)
如果有办法检查Exprs 的alpha等价(等价模重命名).Expr然而,这与lambda演算的不同之处在于lambda中的变量集是可交换的 - 即参数的顺序不会影响检查.
(但是,为了简单起见,与此Lambda ["x","y"] ...不同Lambda ["x"] (Lambda ["y"] ...),在这种情况下,顺序确实很重要).
换句话说,给定两个Exprs,如何才能有效地找到从一个到另一个的重命名?NP-complete这种组合问题的气味.
syntax haskell lambda-calculus np-complete abstract-syntax-tree
我正在尝试使用Beam Haskell库的教程:https://tathougies.github.io/beam/tutorials/tutorial1/
module Lib
( someFunc
) where
{-# LANGUAGE
DeriveGeneric
, GADTs
, OverloadedStrings
, FlexibleContexts
, FlexibleInstances
, TypeFamilies
, TypeApplications
#-}
import Database.Beam
import Database.Beam.Postgres
import GHC.Generics
import Data.Text (Text)
data UserT f
= User
{ _userEmail :: Columnar f Text
, _userFirstName :: Columnar f Text
, _userLastName :: Columnar f Text
, _userPassword :: Columnar f Text }
deriving Generic
someFunc :: IO ()
someFunc = putStrLn "someFunc"
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
• Can't make …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,我应该编写一个函数,在其参数中使用一个函数,使用它并返回一个函数,其行为根据我传入的函数而变化,要清楚:在我的应用程序中:一个简单的缓存服务器,我读过一个上下文文件和所有参数之间的"LOG:活动"如果日志处于活动状态我必须在屏幕上给出日志以进行调试,否则我什么都不写,我不想使用if-then链,因此我想过写一个函数
setLogging a = do
if a
then let logging x = putStrLn x
in return logging
else let logging x = putStrLn ""
in return logging
Run Code Online (Sandbox Code Playgroud)
我以这种方式使用它doLog <- setLogging True并且它可以工作,我的函数应该返回从缓存中删除旧元素的函数:它必须包含多少元素由上下文决定; 这是我的功能
--ritorna la funzione che riduce la cache in funzione dell environment
setTrimming a = do
if a=="active"
then let trimming c logging = reduceCache 9 logging c --è attivo lowbandwidth
in return trimming
else let trimming c logging = reduceCache 5 logging c --non è attivo …Run Code Online (Sandbox Code Playgroud) 是否可以指定datakind的每个成员都满足类型类,以便隐含类约束?例如
data AB = A | B
class Foo (a :: AB) where get :: proxy a -> String
instance Foo A where get _ = "A"
instance Foo B where get _ = "B"
-- note lack of constraint here
get' :: proxy (a :: AB) -> String
get' = get
Run Code Online (Sandbox Code Playgroud)
基本上a是AB这样,我们确定有一个实例Foo.我发现它不太可能 - 它会在哪里获得Foo字典? - 但我在我的日子里看到了一些魔力.