当我尝试使用Type.Showtype中的printtype函数时.我发现类型签名是:printtype
printtype :: Showtype a => proxy a -> IO ()
Run Code Online (Sandbox Code Playgroud)
这里令人困惑的是它的类型proxy a,它似乎来自Data.Proxy,但我找不到任何定义proxy,很明显是不同的Proxy,因为第一个字母proxy是小写的.我知道数据类型的第一个字母在Haskell中不能小写,所以proxy a不是类型,但为什么它可以出现在类型签名中?
我尝试在Windows 7(GHC版本:8.4.2)中使用但不成功安装old-time-1.1.0.3cabal intall old-time,这是错误消息:
Configuring old-time-1.1.0.3...
..\old-time-1.1.0.3\configure: line 1038: $'with_compiler\r=ghc': command not found
configure: WARNING: unrecognized options: --with-compiler
checking for gcc... ../mingw/bin\gcc.exe
checking whether the C compiler works... yes
checking for C compiler default output file name... a.exe
checking for suffix of executables... .exe
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether ../mingw/bin\gcc.exe accepts -g... yes
checking for ../mingw/bin\gcc.exe …Run Code Online (Sandbox Code Playgroud) 我从Haskell中的基本类型级编程学习Haskell的类型编程,但是当它引入DataKinds扩展时,这个例子似乎有些令人困惑:
{-# LANGUAGE DataKinds #-}
data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)
现在,Nat升职Kind,没关系.但如何Zero和Succ?
我尝试从GHCi获取一些信息,所以我键入:
:kind Zero
Run Code Online (Sandbox Code Playgroud)
它给
Zero :: Nat
Run Code Online (Sandbox Code Playgroud)
没关系,Zero是一种类型Nat,对吗?我尝试:
:type Zero
Run Code Online (Sandbox Code Playgroud)
它仍然给出:
Zero :: Nat
Run Code Online (Sandbox Code Playgroud)
这意味着Zero有类型Nat,这是不可能的,因为Nat是一种不是类型,对吗?难道Nat是这两个类型和种类?
而其他令人困惑的事情是,上面的博客也提到,在创建Nat种类时,有两种新类型:'Zero并且'Succ是自动创建的.当我再次从GHCi尝试时:
:kind 'Zero
Run Code Online (Sandbox Code Playgroud)
给
'Zero :: Nat
Run Code Online (Sandbox Code Playgroud)
和
:type 'Zero
Run Code Online (Sandbox Code Playgroud)
给
Syntax error on 'Zero
Run Code Online (Sandbox Code Playgroud)
好的,它证明这'Zero是一种类型.但是创造'Zero和' …
是否存在一个无点函数,filter用于查找列表中对的第一个元素的最小值?例如:
findMinimum xs = filter ((== minimum (map fst xs)) . fst ) xs
-- example:
findMinimum [(0, 0), (0, 1), (2, 2), (3, 2), (1, 4)] = [(0, 0), (0, 1)]
Run Code Online (Sandbox Code Playgroud)
如何将findMinimum函数转换为无点:
findMinimum = ??
Run Code Online (Sandbox Code Playgroud) 我想使用运算符和规则的定义来构建一个规则,如下所示:
type Rule a = [Symbol a]
Run Code Online (Sandbox Code Playgroud)
和符号的定义为:
data Symbol a = Empty | End | LangSym a
Run Code Online (Sandbox Code Playgroud)
现在定义一个<.>可以应用于以下四种情况的运算符:
(<.>)::Symbol a->Symbol a->Rule a
(<.>)::Rule a->Symbol a->Rule a
(<.>)::Symbol a->Rule a->Rule a
(<.>)::Rule a->Rule a->Rule a
Run Code Online (Sandbox Code Playgroud)
显然,我们需要<.>使用 typeclass重载运算符作为
class RuleOperator s1 s2 where
(<.>)::s1 a->s2 a->Rule a
Run Code Online (Sandbox Code Playgroud)
当实例类型类为Symbolas时没有问题
instance RuleOperator Symbol Symbol where
x <.> y = [x, y]
Run Code Online (Sandbox Code Playgroud)
但是当实例有 时Rule a,由于Rule a是类型同义词,我们不能这样做
instance RuleOperator Symbol Rule where
....
Run Code Online (Sandbox Code Playgroud)
和限制是我们无法改变的定义Rule …