小编Nat*_*ell的帖子

你能在Haskell的类型级别进行模式匹配吗?

基本上,我想要的是一个函数,它接受一个函数类型(a - > b - > c - > ...),并返回该函数类型的所有右子集类型的列表,例如,让我们调用这个功能f:

x = f (a -> b -> c)

x
> [a -> b -> c, b -> c, c]
Run Code Online (Sandbox Code Playgroud)

这应该适用于多态类型,如我的示例,以及具体的函数类型.

如果您可以在类型级别上使用函数类型进行模式匹配,那么这将是相对简单的:

g (x -> xs) = xs
g (x) = x
Run Code Online (Sandbox Code Playgroud)

用作上面构造f的效用函数,并且函数类型上的模式匹配类似于在列表上进行模式匹配.

haskell types algebraic-data-types

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

是否可以使用Idris FFI作为效果?

假设我Eff () [STDIO]在Idris中有类型的功能.这使您可以执行基本的控制台I/O操作,但不允许您使用Idris的外部函数接口.

在idris中是否有效果可以让你这样做,还是以其他方式解决这个问题?我不想IO这个例子中使用,因为我希望能够将FFI与其他效果混合使用.因此,如果我想使用FFI和状态效果,例如,我希望能够使用类型:Eff () [FFI,State Int].这在Idris的当前实施中是否可行?

idris

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

在 Haskell 中对幺半群相干建模

通常,每当在 Haskell(或任何其他语言)中使用幺半群运算符时,我发现自己在问“如果语言本身支持幺半群运算的规范化会不会很方便?允许我们在某些东西上工作像一个严格的幺半群?”

最近,我有一个想法,可以通过使用类型系列在 Haskell 中实现与此类似的东西(尽管并不完全相同,因为 ex((), a)并且a仍然是不同的类型。要了解我的意思,请考虑以下类型:

-- From Control.Arrow
(***) :: a b c -> a b' c' -> a (b, b') (c, c')

x :: MyArrow () Int
y :: MyArrow String Int
Run Code Online (Sandbox Code Playgroud)

目前,这个API,结合xy***收益率:

x *** y :: MyArrow ((),String) (Int,Int)
Run Code Online (Sandbox Code Playgroud)

但是从“幺半群”的角度来看,我真正想看到的类型是同构的:

x *** y :: MyArrow String (Int,Int)
Run Code Online (Sandbox Code Playgroud)

然而,要使用标准箭头组合器实际实现这一点,需要编写:

(\x -> ((), x)) ^>> (x *** y) :: MyArrow String (Int,Int)
Run Code Online (Sandbox Code Playgroud)

现在,为了绕过这个样板(假设我们不想处理这种将幺半群类型简化为正常形式的簿记),我的想法是使用类型族:

type family Reduce (pi :: …
Run Code Online (Sandbox Code Playgroud)

haskell type-families

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

在Haskell中为状态传递样式idiomatic编写辅助函数?

我正在为纸牌游戏制作一些代码:

splitCards_ (x:xs) (a,b,c) | isGold x   = splitCards xs (a:x,b,c) 
                           | isAction x = splitCards xs (a,b:x,c)
                           | isVP x     = splitCards xs (a,b,c:x)
splitCards_ [] (a,b,c) = (a,b,c)

splitCards xs = splitCards_ xs ([],[],[]) 
Run Code Online (Sandbox Code Playgroud)

基本上,取一张卡片列表,并根据卡片的类型将其分成三个不同的列表.splitCards_通过递归更新它的参数来表示状态更新,然后splitCards(实际函数)用于始终以三个特定类型的卡列表为空来开始计算.

我相信这被称为状态传递风格,我很确定这是完全惯用的,但我更关心的事实是我必须定义一个辅助函数splitCards_才能让它以我想要的方式工作.正在创建像这个惯用的Haskell一样的辅助函数吗?是否有更清晰的方式来写这个?有没有命名约定只是在辅助函数名称的末尾加上下划线?

haskell idiomatic

5
推荐指数
1
解决办法
198
查看次数

APL中的按位操作?

我们需要制作一个程序来模拟我的计算机体系结构类的IEEE浮点数的划分.我几乎已经完成了这个,但我认为看看程序在APL中会是什么样子会很有趣,但据我所知,在APL中没有(直接)方式进行按位操作(按位和/或,转移等...).如果可能,在APL中执行此操作的最简单方法是什么?

bit-manipulation apl

5
推荐指数
1
解决办法
408
查看次数

在单例数据类型中使用 Nat/Natural 的正确方法是什么?

我正在使用单例库在 Haskell 中编写具有多态变体的原型编程语言。我有一个基本类型的类型,如下所示:

import Data.Singletons.TH
import Data.Singletons
import GHC.Natural
import Data.Singletons.TypeLits

$(singletons [d|
  data MyType = 
      PredT
    | ProcT [MyType]
    | IntT
    | FloatT
    | StringT
    | FuncT MyType MyType
    | VariantT Natural [MyType]
    | UnionT [MyType]
  |])
Run Code Online (Sandbox Code Playgroud)

Natural在参数VariantT被用来标识特定的变体,而对于这实际上是很重要的Natural(而不是像在NAT定义为代数数据类型)efficency原因。

问题是,有了这个定义,我得到:

Couldn't match expected type ‘Natural’
     with actual type ‘Demote Natural’
Run Code Online (Sandbox Code Playgroud)

通常,根据我对单例库的经验,当我尝试将类型用作单例SingKind而不支持该类型时,我会遇到这样的错误(无论如何我的理解)e.x. for Char,所以我不知道为什么会这样不工作。

我已经尝试过Demote Natural, Nat, 以及不同的导入(我想也许我没有使用正确的“Nat”或“Natural”,单身人士可以使用),所有这些都给了我类似的错误。这里有什么问题?我是否必须编写单例为 which 类型手动生成的定义Demote a != a,或者我在这里遗漏了什么?

haskell singleton-type

5
推荐指数
0
解决办法
104
查看次数

在Haskell中有"类型扩展"之类的东西吗?

我实际上并不认为"类型扩展"一词正式意味着我想要的东西,但这是我能想到的唯一一个词.

我有一个多态Haskell类型来表示命题逻辑中的术语:

 data PropLogic a = Prop a | Tautology | Contradiction | And (PropLogic a) (PropLogic a)
                | Or (PropLogic a) (PropLogic a) | Implies (PropLogic a) (PropLogic a)
                | Not (PropLogic a)
     deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)

问题是,我还想要一个类似的多态类型用于具有量化运算符的命题逻辑:

data PropQuantifiedLogic a = Prop a | Tautology | Contradiction | And (PropQuantifiedLogic a) (PropQuantifiedLogic a)
                | Or (PropQuantifiedLogic a) (PropQuantifiedLogic a) | Implies (PropQuantifiedLogic a) (PropQuantifiedLogic a)
                | Not (PropQuantifiedLogic a) | Forall (PropQuantifiedLogic a)
                | Exists (PropQuantifiedLogic a)
     deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)

现在,我只需要添加一个前缀的每个值构造其中两个的名字 …

haskell algebraic-data-types

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

在 Rust 中引用 impl 块中的特征

我正在努力将 Haskell 中的一个简单的 prolog 实现翻译成 Rust 以获得乐趣,并获得更多使用该语言的经验。

在 Haskell 中,我有一个类型类:

class Unifiable t v | t -> v where
  variables :: t -> [v]
  subs      :: Unifier v t -> t -> t
  unify     :: t -> t -> (Maybe (Unifier v t))
Run Code Online (Sandbox Code Playgroud)

我在 Rust 中将其转化为以下特征:

pub type Unifier<V,T> = HashMap<V,T>;

pub trait Unifiable<T,V> {
  fn variables(term: T) -> Vec<V>;
  fn subs(unifier: Unifier<V,T>, term: T) -> T;
  fn unify(firstTerm: T, secondTerm: T) -> Option<Unifier<V,T>>;
Run Code Online (Sandbox Code Playgroud)

然后,我定义了一个实用程序函数,只要有 的实例Unifiable可用,我就可以使用它。作为初步定义,我使用了这个:

pub fn …
Run Code Online (Sandbox Code Playgroud)

traits rust

2
推荐指数
1
解决办法
63
查看次数

为什么 Haskell 不接受列表的这种语法?

考虑以下 Idris 中的代码片段:

myList : List Int
myList = [
  1,
  2,
  3
]
Run Code Online (Sandbox Code Playgroud)

结束定界符]与声明本身位于同一列。我发现这是一种很自然的方式来格式化长的多行列表。

但是,Haskell 中的等效代码段无法编译并出现语法错误:

myList :: [Int]
myList = [
  1,
  2,
  3
]

>>  main.hs:9:1: error:
>>     parse error (possibly incorrect indentation or mismatched brackets)?
>>   |
>> 9 | ]
>>   | ^
Run Code Online (Sandbox Code Playgroud)

并且要求将结束定界符]放置在严格大于表达式声明位置的列号上。或者至少,据我所知,这似乎是正在发生的事情。

Haskell 不喜欢这种语法有什么原因吗?我知道 Haskell 解析器和词法分析器之间存在一些微妙的交互,以启用 Haskell 的越位规则实现,所以也许它与此有关。

haskell

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

为什么我可以使用带有记录语法的Maybe,但不能使用常规的ADT语法?

我正在Haskell中编写一些数据类型来表示正式的英语语法.

data S = NP VP
Run Code Online (Sandbox Code Playgroud)

到目前为止,句子只是名词短语和动词短语.惊叹于代数数据类型的优雅之美!

我还将一个限定词和形容词定义为:

data D = A | An | The
type Adj = String -- Too many adjectives for me to list, so I make it a type
                  -- synonym for String.
Run Code Online (Sandbox Code Playgroud)

现在,我遇到了定义NP的问题,这是一个带有可选限定词和形容词的名词.我的第一个天生本能是使用Maybe:

data NP = Maybe D Maybe Adj N
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

Expecting one more argument to `Maybe' In the type `Maybe' In the definition of data 
constructor `Maybe' In the data type declaration for `NP'
Run Code Online (Sandbox Code Playgroud)

(请注意,根据我是否导入了Data.Maybe,错误不会改变)

我使用它的唯一方法是使用记录语法:

data NP' = NP' {determiner :: …
Run Code Online (Sandbox Code Playgroud)

haskell algebraic-data-types

0
推荐指数
1
解决办法
341
查看次数