相关疑难解决方法(0)

Haskell中的孤立实例

使用该-Wall选项编译我的Haskell应用程序时,GHC会抱怨孤立的实例,例如:

Publisher.hs:45:9:
    Warning: orphan instance: instance ToSElem Result
Run Code Online (Sandbox Code Playgroud)

类型类ToSElem不是我的,它由HStringTemplate定义.

现在我知道如何解决这个问题(将实例声明移动到声明Result的模块中),我知道为什么GHC更愿意避免孤立的实例,但我仍然相信我的方式更好.我不在乎编译器是否带来不便 - 而不是我.

我想ToSElem在Publisher模块中声明我的实例的原因是因为它是依赖于HStringTemplate的Publisher模块,而不是其他模块.我试图保持关注点的分离,并避免让每个模块依赖于HStringTemplate.

我认为,与Java的接口相比,Haskell类型类的优点之一是它们是开放的而不是封闭的,因此实例不必在与数据类型相同的位置声明.GHC的建议似乎是忽略了这一点.

所以,我正在寻找的是要么认可我的想法是正确的,要么我有理由忽视/压制这个警告,或者更有说服力的反对我做事的做法.

haskell typeclass ghc

82
推荐指数
5
解决办法
7764
查看次数

当我在Haskell中用*编写时会发生什么?

我试图了解结果

(*) . (+) 
Run Code Online (Sandbox Code Playgroud)

在哈斯克尔.我知道合成算子只是数学函数的标准组成 - 所以

(f . g) = f (g x)
Run Code Online (Sandbox Code Playgroud)

但:

(*) . (+) :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)

我很难理解这种类型的签名.我希望能够做到这样的事情:

((*) . (+)) 1 2 :: Num a => a -> a
= (* (+ 1 2))
Run Code Online (Sandbox Code Playgroud)

的意义是什么 (*) .(+)的签名?我尝试用它来玩它(只是匹配它的签名):

((*) . (+)) 1 (\x -> x + 1) 1
Run Code Online (Sandbox Code Playgroud)

但那无法编译.我正在尝试在编写这些步骤时完成逻辑步骤,但我还没有完全理解它是如何得到这个结果的(以及结果什么).

haskell functional-programming function-composition

45
推荐指数
3
解决办法
1526
查看次数

明确导入实例

如何显式导入类型类实例?另外,如何使用合格的导入进行此操作?

目前,我正在做

import Control.Monad.Error ()
Run Code Online (Sandbox Code Playgroud)

导入我可以用于的monad实例(Either String).以前,我用过

import Control.Monad.Error
Run Code Online (Sandbox Code Playgroud)

我对其中任何一个都不满意,因为Monad实例是隐式导入的.

import haskell typeclass

32
推荐指数
2
解决办法
7330
查看次数

打破Data.Set完整性而不使用GeneralizedNewtypeDeriving

下面的代码使用不安全的GeneralizedNewtypeDeriving扩展来Data.Set通过插入具有不同Ord实例的不同元素来中断:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Set
import System.Random

class AlaInt i where
  fromIntSet :: Set Integer -> Set i
  toIntSet :: Set i -> Set Integer
instance AlaInt Integer where
  fromIntSet = id
  toIntSet = id
newtype I = I Integer deriving (Eq, Show, AlaInt)
instance Ord I where compare (I n1) (I n2) = compare n2 n1 -- sic!  

insert' :: Integer -> Set Integer -> Set Integer
insert' n s = …
Run Code Online (Sandbox Code Playgroud)

security haskell type-safety language-extension

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

使数字函数成为Num的一个实例?

我希望能够使用二元运算符在haskell中组合数值函数.因此,例如,使用一元数字函数:

f*g
Run Code Online (Sandbox Code Playgroud)

应翻译为:

\x -> (f x)*(g x)
Run Code Online (Sandbox Code Playgroud)

并且类似地添加.让你自己的操作员这么做是非常简单的,但我真的很想让Num a => a -> a函数成为Num的一个实例,但我不知道该怎么做.

我也想使这个参数数量通用的,但可能是因为这是多么难以做到的元数泛型函数在Haskell太麻烦了,所以它可能只是更好地界定独立Num a => a -> a -> a,Num a => a -> a -> a -> a等...实例了一些数量相当大.

haskell pointfree

10
推荐指数
2
解决办法
1436
查看次数

Haskell术语:类型与数据类型的含义,它们是同义词吗?

我正在读这本书:Haskell表达学派和第56页,在第5章的开头,我读到了术语"多态数据类型"和"多态类型".

这两个术语是指同一个概念吗?

他们是同义词吗?

或者这两者有什么区别?如果有,那是什么?

haskell terminology

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