首页 \ 问答 \ OCaml约束中的隐式类型变量的范围(Scope of implicit type variables in OCaml constraints)

OCaml约束中的隐式类型变量的范围(Scope of implicit type variables in OCaml constraints)

在Ocaml中,您可以在约束中引入新类型变量,这有助于在类型检查器中强制执行类型标识:

let f g n = (g (n:'n):'n) ;;
val f : ('n -> 'n) -> 'n -> 'n = <fun>

显然可以重复使用这些类型变量(否则这将是一个相当无意义的练习)。 但是,由于它们不是通过某些特殊声明引入的,我想知道它的范围是什么? 它是封闭函数,let-binding还是顶级语句?

有没有办法限制这种隐式引入的类型变量的范围?


In Ocaml you can introduce new type variables inside a constraint, which is useful to enforce type-identities in the type-checker:

let f g n = (g (n:'n):'n) ;;
val f : ('n -> 'n) -> 'n -> 'n = <fun>

It is obviously possible to re-use these type variables (otherwise it would be a rather pointless exercise). However, since they are not introduced by some special statement, I wonder what there scope is? Is it the enclosing function, let-binding or top-level statement?

Is there a way to limit the scope of such an implicitly introduced type-variable?


原文:https://stackoverflow.com/questions/32074393
更新时间:2022-03-18 06:03

最满意答案

感谢Michal的意见,我重新安排了我的控制器,以便通过关联公司创建用户,而不是相反。 相应的公司控制器如下所示:

companies_controller.rb

# GET company/new
def new
    @company = Company.new
    @company.users.build
end

# POST company/
def create
    @company = Company.new(params[:company])

    respond_to do |format|
      if @company.save
        format.html { redirect_to root_path, notice: 'Welcome! Your account has been created successfully. A confirmation link has been sent to your email address.' }
        format.json { render json:  root_path, status: :created, location: @company }
      else
        format.html { render action: "new" }
        format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end
end

GET请求的表单嵌套了Devise User模型字段,如下所示:

new.html.erb

<h2>Create an account</h2>
<%= simple_form_for( @company, :html => {:class => 'form-horizontal' }) do |f| %>
<%= render 'shared/error_messages', :object => @company %>
    <%= f.input     :name, 
                    :label =>'Company name',
                    :placeholder => "Example Company Inc.",
                    :autofocus => true %>
    <%= f.simple_fields_for :users do |builder| %>
        <%= builder.input   :email, 
                            :placeholder => "example@email.com" %>
        <%= builder.input :password %>
        <%= builder.input :password_confirmation %>
    <% end %>
    <%= f.button    :submit, 'Create account',
                    :class => 'btn'%>
<% end %>
<%= link_to "Sign in", new_session_path(:user) %>

现在,如果验证失败,则所有实例属性值将保留在其各自的表单字段中。


Thanks to Michal's input, I rearranged my controllers so that a user will be created through an associated company and not the other way round. The respective company controller looks like this:

companies_controller.rb

# GET company/new
def new
    @company = Company.new
    @company.users.build
end

# POST company/
def create
    @company = Company.new(params[:company])

    respond_to do |format|
      if @company.save
        format.html { redirect_to root_path, notice: 'Welcome! Your account has been created successfully. A confirmation link has been sent to your email address.' }
        format.json { render json:  root_path, status: :created, location: @company }
      else
        format.html { render action: "new" }
        format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end
end

The form the GET request nests the Devise User model fields as follows:

new.html.erb

<h2>Create an account</h2>
<%= simple_form_for( @company, :html => {:class => 'form-horizontal' }) do |f| %>
<%= render 'shared/error_messages', :object => @company %>
    <%= f.input     :name, 
                    :label =>'Company name',
                    :placeholder => "Example Company Inc.",
                    :autofocus => true %>
    <%= f.simple_fields_for :users do |builder| %>
        <%= builder.input   :email, 
                            :placeholder => "example@email.com" %>
        <%= builder.input :password %>
        <%= builder.input :password_confirmation %>
    <% end %>
    <%= f.button    :submit, 'Create account',
                    :class => 'btn'%>
<% end %>
<%= link_to "Sign in", new_session_path(:user) %>

Now, if the validation fails, all instance attribute values remain in their respective form field.

相关问答

更多

相关文章

更多

最新问答

更多
  • h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
  • 创建一个功能(Create a function)
  • 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
  • PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
  • Qt冻结循环的原因?(Qt freezing cause of the loop?)
  • TableView重复youtube-api结果(TableView Repeating youtube-api result)
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
  • 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
  • 以编程方式创建UITableView(Creating a UITableView Programmatically)
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
  • Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
  • 设置kotlin扩展名(Setting a kotlin extension)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 如何在vim中启用python3?(How to enable python3 in vim?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • dedecms如何安装?
  • 在哪儿学计算机最好?
  • 学php哪个的书 最好,本人菜鸟
  • 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
  • 如何覆盖错误堆栈getter(How to override Error stack getter)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
  • 电脑高中毕业学习去哪里培训
  • 正则表达式验证SMTP响应(Regex to validate SMTP Responses)