在Yesod中通过自定义输入表单上传文件的正确方法是什么?
我在AngularJS中开发了一个前端,并通过JSON对象将数据传入和传出服务器.但是,上传文件时这不起作用.出于这个原因,我使用了表格.
收集不同的资源我最终得到以下代码.在客户端,我使用以下功能:
this.submitNewMeas = function() {
var selected_file = document.getElementById('measurements').files[0];
var fd = new FormData();
fd.append("measurementsFile", selected_file);
var response = $http({
method: 'POST',
url: '/measurements/'+this.currMedia.id,
headers: {
'Content-Type': 'multipart/form-data'
},
data: {
fd
},
transformRequest: formDataObject
});
...
};
Run Code Online (Sandbox Code Playgroud)
在服务器端,我收到如下数据:
postMeasurementsR :: MediaId -> Handler Value
postMeasurementsR mediaId = do
result <- runInputPost $ iopt fileField "measurementsFile"
case result of
Just fileInfo -> do
saveMeas fileInfo "measDir"
saveMeas :: FileInfo -> FilePath -> HandlerT App IO (FilePath) …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置堆栈以使用私有git存储库的Haskell包.看一下文档,似乎可以将git存储库添加为本地依赖项.问题是我看不到指定登录服务器的凭据的方法.
使用堆栈添加私有git存储库包的正确方法是什么?
编辑:为了完整起见,我添加了stack.yaml编辑的部分,以便能够使用私有存储库:
packages:
- '.'
- location:
git: ssh://git@urlprivate-git-repo.com:7999/project/subproject.git
commit: 4ac0e47bfd3
subdirs:
- subdir-of-the-private-package
extra-dep: true
Run Code Online (Sandbox Code Playgroud)
正如@renegadeborealis指出的那样,身份验证是在Stack之外进行的.
我正试图将我的头围绕在提升的数据构造函数上。我特别想知道它们在不涉及类型系列和 GADT 的上下文中是否有用。所以我试图考虑是否可以使用它们来限制某个函数可以采用的术语级别值。例如,是否可以定义一个仅接受所有True术语列表的函数。以下将不起作用,因为(->)它是来自Typeto的函数Type并且'[ 'True]具有 kind [Bool]:
allTrue :: '[ 'True] -> Int
allTrue = length
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否可以使用提升的数据构造函数'True来定义这样的函数。此外,这样的定义是否总是需要 GADT 和/或类型族?
通常,当向.cabal文件添加新的依赖项时,我指定了我依赖的新库的版本.但是stack使用一组策划的库,我想知道在.cabal文件中指定包版本是否有意义.我的猜测是指定lts版本stack.yaml就足够了.
我正在浏览Haskell中的Functional Systems幻灯片.在该讲座中,定义了一个函数recDir2,用于unsafeInterleaveIO递归列出目录中的所有文件:
import qualified Data.ByteString.Lazy as L
recDir2 :: FilePath -> IO [FilePath]
recDir2 dir = do
ds <- openDirStream dir
let protect m = m `onException` closeDirStream ds
nextName = unsafeInterleaveIO $
protect (readDirStream ds) >>= checkName
checkName "" = closeDirStream ds >> return []
checkName "." = nextName
checkName ".." = nextName
checkName name = getSymbolicLinkStatus path >>= checkStat path
where path = dir </> name
checkStat path stat
| …Run Code Online (Sandbox Code Playgroud) 我已经定义了以下自定义解析器:
newtype St = St Int
type TxsParser = ParsecT String St (State St)
Run Code Online (Sandbox Code Playgroud)
现在为了能够运行这个解析器,我必须使用该runParserT函数.
runParserT :: Stream s m t
=> ParsecT s u m a
-> u
-> SourceName
-> s
-> m (Either ParseError a)
Run Code Online (Sandbox Code Playgroud)
哪个实例化到我的自定义解析器读取:
runParserT :: ParsecT String St (State St) a
-> St
-> SourceName
-> String
-> State St (Either ParseError a)
Run Code Online (Sandbox Code Playgroud)
但这意味着如果我想评估runParserT(状态monad)的结果,我必须提供另一个初始状态(St在这种情况下为类型).例如:
evalState (runParserT myParser (St 0) fp input) (St 0)
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但我必须重复两次状态似乎是错误的.这是否意味着混合ParsecT和Statemonad不是一个好主意?