小编Joe*_*hoi的帖子

什么是printtype函数中的"proxy a"?

当我尝试使用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不是类型,但为什么它可以出现在类型签名中?

haskell

6
推荐指数
1
解决办法
89
查看次数

如何在Windows 7中安装old-time-1.1.0.3

我尝试在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

6
推荐指数
0
解决办法
152
查看次数

对DataKinds扩展感到困惑

我从Haskell中的基本类型级编程学习Haskell的类型编程,但是当它引入DataKinds扩展时,这个例子似乎有些令人困惑:

{-# LANGUAGE DataKinds #-}
data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)

现在,Nat升职Kind,没关系.但如何ZeroSucc

我尝试从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和' …

haskell types data-kinds

5
推荐指数
2
解决办法
244
查看次数

无过滤功能

是否存在一个无点函数,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)

haskell filtering pointfree tacit-programming

4
推荐指数
1
解决办法
142
查看次数

如何使用类型同义词重载运算符?

我想使用运算符和规则的定义来构建一个规则,如下所示:

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 …

haskell

3
推荐指数
1
解决办法
97
查看次数