我正在写一个data记录来编组一个JIRA JSON对象.问题是,多个对象具有相同的名称/值对标签.例如 :
(从curl返回并格式化)
{"expand":"schema,names"
,"startAt":0
,"maxResults":2
,"total":74
,"issues":[
{"expand":"editmeta,renderedFields,transitions,changelog,operations"
,"id":"183614"
,"self":"https://10.64.16.44/rest/api/latest/issue/183614"
,"key":"BNAP-339"
,"fields":{"versions":[
{"self":"https://10.64.16.44/rest/api/2/version/28240"
,"id":"28240"
,"name":"2012-12-07"
,"archived":false
,"released":false
}
]
,"status":{"self":"https://10.64.16.44/rest/api/2/status/1"
,"description":"The issue is open and ready for the assignee to start work on it."
,"iconUrl":"https://10.64.16.44/images/icons/status_open.gif"
,"name":"Open"
,"id":"1"
}
,"description":"Do Re Mi Fa"
,"resolution":null
}
}
]
Run Code Online (Sandbox Code Playgroud)
当我构造有问题的相应Haskell data记录时,我得到:
data Issue = Issue {expand :: String
,id :: String
,self :: String
,key :: String
,fields :: Fields
} deriving Generic
data Version = …Run Code Online (Sandbox Code Playgroud) 我写了一个CRUD应用程序来与JIRA接口.我最终升级了我的haskell环境,因为cabal-dev并没有解决所有问题.结果,我有一些破损,随着我尝试使用任何与JIRA接口的代码时出现此错误.
Spike: HandshakeFailed (Error_Misc "user error (unexpected type received. expecting
handshake and got: Alert [(AlertLevel_Warning,UnrecognizedName)])")
Run Code Online (Sandbox Code Playgroud)
经过一番谷歌搜索后,我认为这与使用tls的tls或http-conduit有关.
我目前正在使用tls-1.1.2,http-conduit-1.8.7.1
之前我正在使用
tls-0.9.11并且http-conduit >= 1.5 && < 1.7(不确定到底哪个旧安装已经消失了.
这是我相信休息时间正在发生的地方
manSettings :: ManagerSettings
manSettings = def { managerCheckCerts = \ _ _ _-> return CertificateUsageAccept }
Run Code Online (Sandbox Code Playgroud)
这就是它过去的样子
manSettings :: ManagerSettings
manSettings = def { managerCheckCerts = \ _ _ -> return CertificateUsageAccept }
Run Code Online (Sandbox Code Playgroud)
这是使用它的代码
initialRequest :: forall (m :: * -> *). URI -> IO (Request m,Manager)
initialRequest uri …Run Code Online (Sandbox Code Playgroud) 我从工作了代码此文件.我的翻译更加冗长,这让我烦恼.它发生在我身上我错过了一些显而易见的东西,它会像原来的米兰达一样简洁.
这是米兰达:
fix :: qtree(*) -> qtree(*)
fix(Leaf(x)) = Leaf(x)
fix(Internal(nw, ne, sw, se)) =
merge(Internal(fix(nw), fix(ne), fix(sw), fix(se)))
where
merge(Internal (Leaf(x), Leaf(x), Leaf(x), Leaf(x))) = Leaf(x)
merge(other) = other
Run Code Online (Sandbox Code Playgroud)
请注意LHS merge.它捕获了所有四个叶子具有相同值的情况.不能直接音译到Haskell,因为我会得到多个定义的抱怨x.这是我的版本:
fix :: (Eq a) => QTree a -> QTree a
fix (Leaf a) = Leaf a
fix (Internal nw ne sw se) =
merge (Internal (fix nw) (fix ne) (fix sw) (fix se))
where
merge internal@(Internal (Leaf w) (Leaf x) (Leaf y) (Leaf …Run Code Online (Sandbox Code Playgroud) 这是以前的代码(我希望适当截断)
makeNetworkDescription :: forall t . Frameworks t => Parameters -> Moment t ()
makeNetworkDescription params = do
eInput <- fromAddHandler (input params)
eTick <- fromAddHandler (tick params)
..
let
bResourceMap :: Behavior t ResourceMap
bResourceMap = accumB initRmap $
adjustMarket <$>
bMarketRolls <@
eTick
Run Code Online (Sandbox Code Playgroud)
但现在类型已经改变了.
我们有:
makeNetworkDescription :: Parameters -> MomentIO ()
和
accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)
说我改变的定义bResourceMap来
bResourceMap :: Behavior ResourceMap
bResourceMap = accumB initRmap …Run Code Online (Sandbox Code Playgroud) 所以我认为Lambdas在Learn You a Haskell中得到了证明:
(filter (\xs -> length xs > 15) (map chain [1..100]))
Run Code Online (Sandbox Code Playgroud)
xs的输入是从(map chain [1..100]))
容易阅读的生成的列表.
所以这里我感到困惑,看一些真实世界代码(tm).
这是管道的功能
fmap f (ResourceT m) = ResourceT $ \r -> fmap f (m r)
Run Code Online (Sandbox Code Playgroud)
r的输入来自哪里?
在Data.List中,我看到了这个不熟悉的模式匹配:
{-# NOINLINE [1] unsafeTake #-}
unsafeTake :: Int -> [a] -> [a]
unsafeTake !_ [] = []
unsafeTake 1 (x: _) = [x]
unsafeTake m (x:xs) = x : unsafeTake (m - 1) xs
Run Code Online (Sandbox Code Playgroud)
我的理解是!删除thunk.好的,但_被忽略了.有些东西我不理解.澄清表示赞赏.
假设我有这两个数据记录X和Y以及以下两个函数:
f1 :: IO (Maybe [X])
f2 :: X -> IO (Maybe Y)
Run Code Online (Sandbox Code Playgroud)
我需要先调用f1,然后对返回列表(存储在中IO (Maybe))的每个元素调用f2,这将导致类似的结果IO (Maybe [IO (Maybe Y)])。我怎样才能使他们变得有意义,例如
result :: Maybe (IO [Y])
Run Code Online (Sandbox Code Playgroud)
要么
result :: IO (Maybe [Y])
Run Code Online (Sandbox Code Playgroud)
?
非常感谢您的帮助:-)
Heinrich Apfelmus慷慨地介绍了这个问题.我曾考虑过使用它accumB作为解决方案,但认为会出现类型错误.无论如何,在尝试了他的建议之后,我确实收到了类型错误.
let bGameState :: Behavior t GameState
bGameState = accumB initialGS $ updateGS <$ eInput
yields the error
Couldn't match expected type `GameState'
with actual type `PlayerCommand'
Expected type: GameState -> GameState
Actual type: PlayerCommand -> GameState -> GameState
In the first argument of `(<$)', namely `updateGS'
In the second argument of `($)', namely `updateGS <$ eInput'
Run Code Online (Sandbox Code Playgroud)
所以我研究了(<$),并且局部应用了.看看他建议的例子.我做的越多,我就越认为上面的代码应该起作用了,我感到困惑的是为什么它没有.
这是我认为应该发生的事情:
因为(<$)是类型(<$) :: a -> f b -> f …
这是我的代码:
reverseEncode :: Char -> String -> Int -> Char
reverseEncode _ [] _ = ?
reverseEncode c (x:xs) offset
| alphaPos c == (alphaPos x + offset) `mod` 26 = chr (((alphaPos x + offset) + 65) `mod` 26)
| otherwise = reverseEncode c xs offset
Run Code Online (Sandbox Code Playgroud)
这只是虚拟Enigma Machine中使用的一种小方法。在编写没有第二行的函数并对其进行测试之后,我得到了以下异常:
Non-exhaustive patterns in function reverseEncode
Run Code Online (Sandbox Code Playgroud)
然后我意识到我没有告诉函数何时停止递归。这就是第二行代码的诞生方式。显然,我可以在每个步骤中检查字符串的长度,但是看起来并不优雅。
在Haskell中,有什么我可以代替的吗??如果没有,我有什么可以定义的吗?还是可以通过更好的方式完成此操作?
编辑:我实际上已经通过检查字符串的长度尝试了版本,并且我得到了相同的异常。那么我该如何运作呢?
如何将函数的输出作为另一个函数的输入传递.
例如,我有这两个功能
collatz :: (Integral a) => a -> [a]
collatz 1 = [1]
collatz n
|even n = n:collatz (n `div` 2)
|odd n = n:collatz (n*3 + 1)
Run Code Online (Sandbox Code Playgroud)
而我的另一个功能
length' [] = 0
length' (x:xs) = 1 + length' xs
Run Code Online (Sandbox Code Playgroud)
我想计算列表的长度,这是从我的collatz函数输出的.
最后我想完全计算这个
numLongChains :: Int
numLongChains = length (filter isLong (map collatz [1..100]))
where isLong xs = length xs > 15
Run Code Online (Sandbox Code Playgroud)
但一步一步.