- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
起点:
fn :: [a] -> Int
fn = (2 *) . length
假设我们只想限制返回值,那么我们可以这样写:
fn list = (2 * length list) :: Int
仅限制参数怎么样?简单。
fn list = 2 * length (list :: [Char])
虽然这有效,但最好有签名顶部聚集,而不是分散在函数体周围。
这是我能达到的最接近的结果:
fnSig = undefined :: [Char] -> a
fn | False = fnSig
| True = (* 2) . length
基于http://okmij.org/ftp/Haskell/partial-signatures.lhsvượt quahttp://okmij.org/ftp/Haskell/types.html#partial-sigs
但是,我想要一个更干净的解决方案。更好地传达我的意图的东西是部分限制。例如这样的事情:
fn :: [Char] -> a
fn = (2 *) . length
或者也许:
fn :: [Char] -> _
fn = (2 *) . length
Liệu điều này có thể thực hiện được không?
@GaneshSittampalam 在下面的评论中提出了一个重要观点。我正在寻找“一个介于完全没有类型签名和必须给出精确类型签名之间的折中方案”。因此,我不是在寻找基于 TypeClass 的答案,我只是希望 GHC 填充我的函数的未指定(或未完全限制)类型的空白。
是的,像这样......
fn list = 2 * length list
Ở đâu
_ = list :: [Char]
...可以工作,但仅适用于参数,并且仅当函数不是无点的时。有没有办法将此技术应用于无点函数或返回值?
我受到启发,并尝试了 @Rhymoid 的想法,并想出了这个:
fn = (2 *) . length
Ở đâu
_ = fn `asTypeOf` (undefined :: [Char] -> a)
_ = fn `asTypeOf` (undefined :: a -> Int)
_ = fn `asTypeOf` (undefined :: a -> b)
_ = fn `asTypeOf` (undefined :: a)
这种方法还限制了 fn 的类型签名,并且不会污染任何命名空间。
通常我们只有一个 asTypeOf
行,我只是添加了多个来展示这种方法的强大功能。
这比我想要的要笨拙一些,但我想即使没有语言的特定语法支持,我们也可以做到这一点,这非常巧妙。
@Rhymoid,如果您也喜欢它,请将其添加到您的答案中。 :)
1 Câu trả lời
抱歉 self 推销,但正是这个功能是博士最近一篇论文的主题。学生 Thomas Winant、我本人、Frank Piessens 和 Tom Schrijvers,最近由 Thomas 在 PADL 2014 研讨会上发表。完整论文请参见 đây。该功能已经存在于其他一些语言中,但与 Haskell GADT 等功能的交互使其变得足够有趣,足以解决细节问题。
Thomas 正在致力于 GHC 的实现。自论文撰写以来,它已经得到了进一步的改进,但在 GHC 中实现“通配符约束”在技术上比我们预期的要困难一些。我们希望能够进一步研究它并联系 GHC 开发人员以使其采用,但这种情况是否发生可能取决于有多少人希望在 Haskell 中拥有该功能......
2015 年 4 月 14 日更新:经过 Thomas 的大量工作以及 SPJ 和其他 GHC 人员的投入,部分类型签名已在 GHC 7.10 中发布。 Thomas Winant 写了一篇关于如何使用它们的 an introductory blog post 文章。
关于haskell - 如何在 Haskell 中部分定义函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658438/
Tôi có hàm printHashKey này và nó hoạt động tốt. vui vẻ printHashKey() { thử { val info : PackageInfo = packageM
Làm thế nào để tôi ký gói ứng dụng Android của mình bằng khóa ký chính xác? Câu trả lời hay nhất Tôi đã thử sử dụng nhiều câu trả lời ở đây và trong câu hỏi này, nhưng bằng cách nào đó tôi nhận được lỗi này vì android/ứng dụng của tôi
Tôi có điều này trong tệp gradle của tôi: android { signingConfigs { mySigningConfig { keyAlias 'the
Vui lòng chọn ít nhất một phiên bản chữ ký để sử dụng trong Android Studio 2.3 Bây giờ khi bạn tạo APK đã ký trong Android Studio, nó sẽ hiển thị hai tùy chọn (hộp kiểm) cụ thể là 1. V1 (Chữ ký Jar)
Tôi muốn biểu diễn một số giá trị vô hướng (ví dụ số nguyên hoặc chuỗi) theo giá trị thực của nó hoặc một số giá trị NA rồi lưu trữ chúng trong một bộ sưu tập (ví dụ danh sách). Mục đích là xử lý các giá trị bị thiếu. Để thực hiện điều này, tôi đã triển khai một mô-đun chữ ký loại Scalar = sig
Tại sao cách này lại không hiệu quả? sum :: (Num a, Num b) => a -> b -> c sum ab = a + b Tất nhiên thông báo lỗi có liên quan đến chữ ký, nhưng tôi vẫn không hiểu tại sao. Không thể chiếu được
Cảm ơn sự trợ giúp, câu hỏi của tôi liên quan đến giá trị ax nhận được từ đoạn mã bên dưới? mov al,22h mov cl,0fdh imul cl Kết quả thực tế: ff9a Kỳ vọng của tôi: 00:9a (thông qua phép nhân nhị phân) Số đầu tiên là 22h
Tôi có một chú thích: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
Tôi nghĩ ra một thuật ngữ khi suy nghĩ về các đồ vật. Khi chúng ta mở rộng một lớp, lớp mở rộng sẽ có cùng chữ ký với lớp cha, do đó thuật ngữ IS-A xuất phát từ... Ví dụ lớp Foo{ } lớp Foo2 mở rộng Foo{ } c
Tôi cần chuyển đổi giữa số nguyên có dấu và biểu diễn bên trong của chúng dưới dạng chuỗi byte. Trong C, tôi sử dụng hàm sau: unsigned char hibyte(unsigned short i) {return i>>8;}
Tôi đang cố gắng ký một số dữ liệu bằng cách sử dụng các tham số RSA được cung cấp. Tôi đã đưa ra môđun, số mũ, D, DP, DQ, P, Q và InverseQ. Thư viện hoặc phương pháp nào dễ sử dụng nhất để tính toán chữ ký này? Trong C#, sau khi bạn cung cấp các tham số, chúng có
Sự khác biệt giữa các chữ ký này là gì? T * f(T & định danh); T & f(T & định danh); T f(T & định danh); void f(T * định danh
Câu hỏi này đã có câu trả lời ở đây: Đã đóng cách đây 11 năm. Có thể trùng lặp: Tôi phải đặt “mẫu” và “kiểu” ở đâu và tại sao?
Tôi có chữ ký và cần thêm hình ảnh bên cạnh chữ ký. Nhưng tôi không chắc chắn chính xác là bao nhiêu và css là gì. Hiện tại nó hiển thị bên dưới văn bản, tôi nên đặt hình ảnh ở đâu? Trong cùng một tr hay td?
Khi xem mã nguồn JDK cho LinkedHashMap, tôi nhận thấy rằng lớp này được khai báo là: public class LinkedHashMap extends HashMap im
Bối cảnh: Tôi được thừa hưởng một hệ thống nhúng dựa trên Linux bao gồm một proxy SMTP và một số hạn chế kỳ quặc mà tôi phải chấp nhận. Nó nằm giữa máy khách và máy chủ SMTP. Khi máy khách SMTP kết nối, proxy sẽ mở kết nối tới máy chủ.
Đây là quy tắc trong dạng C++17 ([basic.lval]/8), nhưng nó có vẻ tương tự trong các tiêu chuẩn khác (đó là "lvalue" thay vì "glvalue" trong C++98): 8 Nếu một chương trình cố gắng
Tôi có một chú thích: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
Tôi có một dự án sắp tới trong đó tôi muốn sử dụng bảng chữ ký điện tử để ghi lại chữ ký của khách hàng bằng C#, hiển thị văn bản trên thiết bị, v.v. Bây giờ, trước khi tôi bắt đầu nghiên cứu sâu hơn, tôi muốn hỏi mọi người một số ý kiến/gợi ý về thiết bị tôi nên sử dụng. Yêu cầu của tôi hiện rất chung chung: Tôi
Tiếng thì thầm bắt đầu mở rộng lãnh thổ trong tim nó, như thể nó đã được phát sóng ba lần theo một cách thông thường. Những gợn sóng đẹp đẽ được tạo ra bằng một kỹ thuật không mấy tinh vi. Từ chối bình minh nhưng vẫn khao khát ánh nắng rực rỡ. Dòng hình ảnh bất tận chính là họ, và tấm rèm của tôi dừng lại ở chân phải tôi, nó háo hức bước xuống, và tôi chỉ còn lại lời tự nói với chính mình
Tôi là một lập trình viên xuất sắc, rất giỏi!