purescript的OAUTH

purescript的OAUTH,oauth,purescript,Oauth,Purescript,我对Purescript是新手。我正在搜索OAuth客户端并找到了。 我不知道如何构建它,但这是我尝试过的 我已经在我按照《入门指南》创建的第一个项目下复制了源代码。 当I纸浆构建时的第一个错误是 Error 1 of 3: at src\Network\OAuth.purs:138:1 - 138:1 (line 138, column 1 - line 138, column 1) Unable to parse module: expecting indentati

我对Purescript是新手。我正在搜索OAuth客户端并找到了。 我不知道如何构建它,但这是我尝试过的

我已经在我按照《入门指南》创建的第一个项目下复制了源代码。 当I
纸浆构建时的第一个错误是

Error 1 of 3:

  at src\Network\OAuth.purs:138:1 - 138:1 (line 138, column 1 - line 138, column 1)

    Unable to parse module:
    expecting indentation past column 1
这是我通过评论出来的,对吗

但我现在越来越紧张了

Error 1 of 3:

  at src\Network\OAuth.purs:228:3 - 228:3 (line 228, column 3 - line 228, column 3)

    Unable to parse module:
    unexpected {
    expecting data constructor name
我该如何解决这个问题(假设到目前为止我所做的一切都很好…我也不知道)

我正在查看和的文档,但无法立即发现错误(除了我接下来要写的内容)。特别是,根据语言规则,它似乎是一个正确的记录定义

PureScript记录对应于JavaScript对象。他们可能有 零个或多个命名字段,每个字段都有自己的类型。例如:
{name::String,greet::String->String}
对应于 JavaScript对象,正好有两个字段:
名称
,它是一个
字符串
, 和
greet
,该函数接受
字符串并返回
字符串

因此,我做了一个实验,在错误之前添加了几行,这是对
数据
关键字的文档和另一行的外推

上面的两行代码都很好,下面的代码也很好

type Foo a = {foo :: Foo | bar :: Bar a}
所以我想我必须用
类型
替换
数据
,但这有意义吗?下面的修复似乎有效(但我在github的其他代码文件中有其他错误…)


我的路径是否正确(在Purescript中实现OAuth客户机)

实际上,我会和切克索联系,看看他的想法是什么。该库是在PureScript 0.12之前编写的,因此需要进行大量更改才能兼容

类型
数据
是两件不同的事情<代码>类型
引入类型同义词(现有类型的另一个名称),而
数据
引入代数数据类型(其他类型的有区别的和和和积)

记录也是另外一回事<代码>{a∷ A}
在定义上等同于
记录(A∷ A) 

第228行未分析,因为缺少构造函数名称<代码>数据X={a∷ A}
是无效语法,并且
数据X=Y{A∷ }
是有效的语法

我正在搜索OAuth客户机,找到了这个

您已经发现了一个未完成的项目,而最好的方法是为该项目编写绑定

首先,如果您计划与推特集成,请考虑通过节点运行来检索访问令牌(请注意其中的两个注释)。 然后替换

oauth.get
中的2+2秘密(应用程序和用户密钥),最后将其导出为未复制函数模块

例如,假设您只想输出一些tweet,您可以将
log
函数作为有效回调传递

"use strict";
module.exports = {
sayHelloInEnglish: function() {
return "HELLO";
},

logMyTweets: function(callback) {
var OAuth = require('oauth');

    var oauth = new OAuth.OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      'app key',
      'app token',
      '1.0A',
      null,
      'HMAC-SHA1'
    );
    oauth.get(
      'https://api.twitter.com/1.1/lists/statuses.json?slug=develop&owner_screen_name=giuliohome_2017&count=2',
      //'https://api.twitter.com/1.1/trends/place.json?id=23424977',
      'user token', 
      'user secret', 
      function (e, data, res){
        if (e) console.error(e);        
        callback (data);
      }); 

}
};
Purescript绑定 现在,按照上面的示例,您将编写一个Purescript绑定(同名,扩展名为.purs,而不是.js)

用例可以是

module Main where

import Prelude
import Effect (Effect)
import Effect.Console (log)
import Twitting
import Data.Function.Uncurried (Fn0, runFn0, Fn1, runFn1)
import Effect.Uncurried (runEffectFn1, mkEffectFn1)

callback :: String -> Effect Unit
callback = log

main :: Effect Unit
main = do
  log "Hello sailor!"
  log (runFn0 sayHelloInEnglish)
  runEffectFn1 logMyTweets (mkEffectFn1 callback)
下一步 当然,现在我们可以继续了

由于我们的程序正在以字符串形式接收
JSON
数据,我们可能需要
data.Argonaut.Parser
中的
jsonParser
函数,它是JavaScript的
JSON.parse
的一个非常简单的包装器。 否则,
Json
值可以通过FFI引入我们的程序

concat::forall a。可折叠a=>a字符串->字符串
康卡特tt=
foldl(\a x->x“\n”a)”“tt
showText::Object A.Json->String
showText推文=
可能是“无文本”A.stringify(查找“文本”推文)
toJsonObject::A.Json->String
toJsonObject j=
A.caseJsonObject“不是json对象”showText j
transform::Array A.Json->Array String
转换e=映射到JSONObject e
showteets::A.Json->Array String
showTweets推特=
A.caseJsonArray[“非json数组”]转换推文
解析::字符串->字符串
解析j=
(\x->x“\n”j)(\x->concat(showteets x))(jsonParser j)
回调::字符串->效果单位
回调j=do
日志(解析j)

最后,假设我们在服务器端,我们很可能会发布一个web应用程序,使用HTTP服务器,如

抱歉坚持一个月前提出的这个问题,但是,作为一个实际问题:有人在purescript上使用(twitter)oauth(可能是服务器端)吗?我没有。我能说的是,在大多数情况下,我不得不编写自己的绑定。web(DOM)包、Argonaut和Foreign可能是唯一的例外。所以我想最好的方法是为
type TokenEndpointSuccessResponse a = { access_token :: a -- See 7.1: Access Token Types
  , token_type :: AccessTokenType
  , expires_in :: Maybe Seconds -- recommended
  , refresh_token :: Maybe RefreshToken
  , scope :: Maybe AccessScope
  }
"use strict";
module.exports = {
sayHelloInEnglish: function() {
return "HELLO";
},

logMyTweets: function(callback) {
var OAuth = require('oauth');

    var oauth = new OAuth.OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      'app key',
      'app token',
      '1.0A',
      null,
      'HMAC-SHA1'
    );
    oauth.get(
      'https://api.twitter.com/1.1/lists/statuses.json?slug=develop&owner_screen_name=giuliohome_2017&count=2',
      //'https://api.twitter.com/1.1/trends/place.json?id=23424977',
      'user token', 
      'user secret', 
      function (e, data, res){
        if (e) console.error(e);        
        callback (data);
      }); 

}
};
module Twitting where
import Data.Unit
import Data.Function.Uncurried (Fn0, Fn1)
import Effect (Effect)
import Effect.Uncurried
foreign import sayHelloInEnglish ::  Fn0 String
foreign import logMyTweets ::  EffectFn1 (EffectFn1 String Unit) Unit
module Main where

import Prelude
import Effect (Effect)
import Effect.Console (log)
import Twitting
import Data.Function.Uncurried (Fn0, runFn0, Fn1, runFn1)
import Effect.Uncurried (runEffectFn1, mkEffectFn1)

callback :: String -> Effect Unit
callback = log

main :: Effect Unit
main = do
  log "Hello sailor!"
  log (runFn0 sayHelloInEnglish)
  runEffectFn1 logMyTweets (mkEffectFn1 callback)
concat :: forall a. Foldable a => a String -> String
concat tt =
  foldl (\a x -> x <> "\n" <> a) "" tt

showText :: Object A.Json -> String
showText tweet =
   maybe "no text" A.stringify (lookup "text" tweet)

toJsonObject :: A.Json -> String
toJsonObject j =
  A.caseJsonObject "not a json object " showText j

transform :: Array A.Json -> Array String
transform e = map toJsonObject e

showTweets :: A.Json -> Array String
showTweets tweets =
  A.caseJsonArray ["not a json array"] transform tweets

parse :: String -> String
parse j = 
  either (\x -> x <> "\n" <> j) (\x -> concat( showTweets x)) (jsonParser j)

callback :: String -> Effect Unit
callback j = do
  log (parse j)